Django is_staff 权限装饰器

Posted

技术标签:

【中文标题】Django is_staff 权限装饰器【英文标题】:Django is_staff permission decorator 【发布时间】:2011-08-15 13:07:26 【问题描述】:

我正在尝试使用 2 个用户级别来限制对页面的访问。超级用户和管理员。 超级用户是分配了“is_superuser”的普通 Django 用户。 管理员用户也是普通用户,只分配了“is_staff”权限。

问题是当我为管理员用户使用这个装饰器时,它没有通过测试:

@permission_required('is_staff')
def my_view(....)

@permission_required('is_staff') 为匿名用户返回 false。 (正确)@permission_required('is_superuser') 仅对超级用户返回 true(正确)@permission_required('is_staff') 对于分配了“is_staff”权限的用户返回 FALSE。 (错误)。

有什么想法吗?

【问题讨论】:

我应该注意我正在使用 Django 1.3 和 python 2.6.1 【参考方案1】:

is_staff 不是权限,因此您可以使用 permission_required 代替:

@user_passes_test(lambda u: u.is_staff)

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required

【讨论】:

我添加了另一个更直观的选项(staff_member_required)。 @permission_required('is_superuser') 为超级用户返回True,因为@permission_required 总是为超级用户返回True,无论该权限是否存在(在这种情况下不存在)。这是假设您使用的是默认身份验证后端。 内置装饰器“staff_member_required”很方便,但我会小心使用它,因为它似乎没有正式记录。 @bjunix 我想​​说staff_member_required 现在按照您的标准可以安全使用。我通过手册“Using the Django authentication system”页面中的“另见”块找到它。 @ssokolow 是的,你是对的,staff_member_required 装饰器现在已记录在案:docs.djangoproject.com/en/1.9/ref/contrib/admin/…【参考方案2】:

对于基于类的视图,您可以将permission_required('is_staff') 添加到urls.py

from django.contrib.auth.decorators import permission_required

url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),

【讨论】:

我没有尝试,但我想知道 'is_staff' 是否在这里按预期工作。【参考方案3】:

对于基于类的视图,UserPassesTestMixin 很方便,例如

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...

【讨论】:

哈哈,几天后才发现我自己的答案......阿尔茨海默病的早期迹象:D 大声笑又遇到了:/【参考方案4】:

不带 lambda 的 @arie 答案的变体可能会快一点(但我没有检查):

import operator
from django.contrib.auth.decorators import user_passes_test

@user_passes_test(operator.attrgetter('is_staff'))
def my_view(....)

话虽如此,我认为更好的方法是为您的视图创建一个Permission 并将其与permission_required 装饰器一起使用。

【讨论】:

以上是关于Django is_staff 权限装饰器的主要内容,如果未能解决你的问题,请参考以下文章

django权限验证装饰器

装饰器 以及 django 中的应用

django的权限认证:登录和退出。auth模块和@login_required装饰器

19Django开发总结:自带的常用装饰器应用场景及正确使用方法总结

在django中应用装饰器

如何在 user_passes_test 装饰器可调用函数中传递 Django 请求对象