Як використовувати групи та дозволи Django?


83

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

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

Відповіді:


121

Я припускаю, що першим запитанням, яке вам потрібно задати, є те, які дозволи вам потрібні і який вид. Яким чином, я маю на увазі, чи хочете ви на рівні моделі чи об'єкта. Щоб уточнити різницю, скажімо, у вас є модель автомобіля. Якщо ви хочете надати дозволи для всіх автомобілів, тоді доречний рівень моделі, але якщо ви хочете надати дозволи для кожного автомобіля, ви хочете на рівні об’єкта. Можливо, вам знадобиться і те, і інше, як ми побачимо, це не проблема.

Що стосується дозволів моделі, Django обробляє їх для вас ... переважно. Для кожної моделі Django створить дозволи у формі 'appname.permissionname_modelname'. Якщо у вас є програма під назвою 'драйвери' з моделлю Car, тоді один дозвіл буде 'drivers.delete_car'. Дозволи, які Django автоматично створює, будуть створювати, змінювати та видаляти. З якоїсь дивної причини вони вирішили не включати дозволи на читання від CRUD, вам доведеться зробити це самостійно. Зауважте, що Django з якихось причин вирішив змінити 'оновлення' CRUD на 'змінити'. Щоб додати більше дозволів до моделі, скажімо, дозволи на читання, ви використовуєте клас 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

Де сутність є об'єктом для перевірки дозволів (Група або Користувач), модель - екземпляр моделі, Пермс - список дозволів як рядки для перевірки (наприклад, ['читати', 'змінити']), а додаток - це ім'я програми як рядок. Щоб зробити ту саму перевірку, що і has_perm вище, ви зателефонуєте приблизно так:

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

Якщо вам потрібно використовувати дозволи на об’єкти або рядки (вони означають одне і те ж), то Django не може допомогти вам сам по собі. Приємно те, що ви можете одночасно використовувати дозволи як на модель, так і на об’єкт. Якщо ви хочете отримати дозволи на об’єкти, вам доведеться або написати свій власний (якщо використовується 1.2+), або знайти проект, написаний кимось іншим, мені подобається django-objectpermissions from washingtontimes.


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
"Напишіть своє". Або щось. Зараз це китайською мовою.
Вільям Карлссон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.