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


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

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

1 76

1 ответ:

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

для разрешений модели, Django обрабатывает их для вы... в основном. Для каждой модели Django будет создавать разрешения в виде ' appname.permissionname_modelname'. Если у вас есть приложение под названием "драйверы" с моделью автомобиля, то одно разрешение будет " драйверы.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

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

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

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