Как использовать группы и разрешения Django?

83

Я понимаю основы работы с пользователем. Я знаю аутентификацию, вход в систему, создание учетных записей и т.д. Но теперь я хочу работать с группами и разрешениями.

Где документация для групп / разрешений django? Это не так: http://docs.djangoproject.com/en/dev/topics/auth/

TIMEX
источник

Ответы:

121

Я полагаю, что первый вопрос, который вам нужно задать, - это какие разрешения вам нужны и какого типа. Я имею в виду, что вы хотите на уровне модели или объекта. Чтобы прояснить разницу, скажем, у вас есть модель Автомобиля. Если вы хотите предоставить разрешения для всех автомобилей, тогда подходит уровень модели, но если вы хотите предоставить разрешения для каждого автомобиля, вам нужен уровень объекта. Вам могут понадобиться и то, и другое, и, как мы увидим, это не проблема.

Что касается разрешений модели, Django обрабатывает их за вас ... в основном. Для каждой модели Django создаст разрешения в форме «appname.permissionname_modelname». Если у вас есть приложение под названием «драйверы» с моделью автомобиля, тогда одно разрешение будет «drivers.delete_car». Разрешения, которые автоматически создает Django, будут создавать, изменять и удалять. По какой-то странной причине они решили не включать разрешения на чтение из CRUD, вам придется сделать это самостоятельно. Обратите внимание, что Django по какой-то причине решил изменить CRUD «update» на «change». Чтобы добавить в модель дополнительные разрешения, скажем, разрешения на чтение, вы используете класс Meta:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

Обратите внимание, что разрешения - это набор кортежей, где элементы кортежа - это разрешение, как описано выше, и описание этого разрешения. Вам не обязательно следовать соглашению permname_modelname, но я обычно его придерживаюсь.

Наконец, чтобы проверить разрешения, вы можете использовать has_perm:

obj.has_perm( 'drivers.read_car' )

Где obj - это экземпляр пользователя или группы. Думаю, для этого проще написать функцию:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

Где entity - это объект для проверки разрешений (группа или пользователь), model - это экземпляр модели, perms - это список разрешений в виде строк для проверки (например, ['read', 'change']), а app - это имя приложения в виде строки. Чтобы выполнить ту же проверку, что и has_perm выше, вы должны вызвать что-то вроде этого:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

Если вам нужно использовать права доступа к объекту или строке (они означают одно и то же), то Django не сможет вам помочь сам по себе. Приятно то, что вы можете одновременно использовать права модели и объекты. Если вам нужны права доступа к объектам, вам придется либо написать свои собственные (если вы используете 1.2+), либо найти проект, написанный кем-то другим, мне нравится django-objectpermissions от washtontimes .

Алекс Куль
источник
27
Это отличный ответ для разрешений, но он почти не касается групп и как они работают в Django?
NotSimon
4
Групп не так уж много, они в основном просто объединяют пользователей для применения разрешений, как и группы пользователей Linux. Вы даете разрешение группе, и оно распространяется на всех членов этой группы. В документации все сказано: docs.djangoproject.com/en/dev/topics/auth/default/#groups .
Alex Kuhl
1
Я чувствую себя обязанным указать здесь, что вы хотите рассмотреть возможность использования для этого django guardian . См. Разбивку пакета авторизации здесь. Также эта ссылка на SOF обеспечивает хорошее сравнение.
Джефф Шеффилд
1
Когда я наткнулся на это и мне потребовалось разрешение на объект, я обнаружил django-guardian: django-guardian.readthedocs.org/en/v1.2
dArignac
1
«Напиши свое» не работает. Или что-то. Теперь это на китайском языке.
Уильям Карлссон