GOOGLE ADS

пятница, 29 апреля 2022 г.

Почему Django использует is_staff и is_superuser вместо разрешения?

Я бьюсь с этим уже пару дней. django.contrib.auth.models имеет модель User, которая разрешает несколько разрешений, но затем имеет 3 флага для is_staff, is_superuser и is_active.

is_staff = models.BooleanField(_('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'))
is_active = models.BooleanField(_('active'), default=True, help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.'))
is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_('Designates that this user has all permissions without explicitly assigning them.'))
groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True, help_text=_('The groups this user belongs to. A user will get all permissions granted to each of his/her group.'))
user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True, help_text='Specific permissions for this user.')

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

Часть причины, по которой я спрашиваю, заключается в том, что у меня похожая ситуация, в которой можно использовать третье логическое значение (или я могу сделать это с разрешением), и я пытаюсь понять, почему они отделяют эти два от разрешений?

Кажется, я понимаю, что is_active позволяет вам заблокировать кого-то без необходимости «исправлять» их разрешения, когда они возвращаются (хотя у вас может быть «разрешение» is_locked_out, но это звучит неправильно).


Решение проблемы

Я собираюсь угадать производительность. Проверка логического поля намного дешевле, чем получение разрешений, связанных с пользователем, из другой таблицы или выполнение соединений sql. Учитывая, что в некоторых случаях статус авторизации пользователей проверяется при каждом запросе, гораздо разумнее (хотя и не так чисто) поместить логические значения в пользовательскую модель и проверять их.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...