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的权限认证:登录和退出。auth模块和@login_required装饰器