Как использовать группы и разрешения Django? - PullRequest
78 голосов
/ 24 января 2011

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

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

1 Ответ

115 голосов
/ 24 января 2011

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

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

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

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

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

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

...