Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Для разрешений модели 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

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

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

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