Ответ 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.