为什么 Django 使用 is_staff 和 is_superuser 而不是将它们设为权限?

问题描述 投票:0回答:2

我已经为此苦苦挣扎了几天。 django.contrib.auth.models 有一个允许多个权限的用户模型,但有 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 “权限”,但这听起来是错误的。)

django authentication django-admin
2个回答
4
投票

我要猜测性能。检查布尔字段比从另一个表获取与用户相关的权限或执行 sql 连接要便宜得多。考虑到在某些情况下,每个请求都会检查用户的授权状态,因此将布尔值放在用户模型上并检查它们会更明智(尽管不是那么干净)。


1
投票

is_superuser是网站的真正管理员,is_staff也是admin。当您在终端上输入

python manage.py createsuperuser
时。 Django 自动生成 is_staffis_superuser True。这意味着您作为管理员拥有对网站的完全控制权。如果您将 is_superuser 更改为 False,那么您只是一个 staffsuperuser 可以通过将您添加到自定义 administration group 来授予 permission。而 is_active 会自动设置为 True,因为如果它设置为 False 那么您将不会 允许 再次使用 account如果您想禁止某个用户访问您的网站,我建议您不要删除该帐户,而是将 is_active 更改为 False,这将阻止他自动访问该帐户

© www.soinside.com 2019 - 2024. All rights reserved.