为什么Django使用is_staff和is_superuser而不是使用权限?

时间:2013-06-27 19:18:12

标签: django authentication

我已经和他摔跤了好几天了。 django.contrib.auth.models有一个允许多个权限的User模型,但是有is_staff,is_superuser和is_active的3个标志。

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“权限”,但这听起来不对。)

1 个答案:

答案 0 :(得分:4)

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