Django is_staff权限装饰者

Dim*_*Dim 51 django permissions admin decorator

我试图限制使用2个用户级别的页面访问.超级用户和管理员.超级用户是指定了"is_superuser"的常规Django用户.管理员用户也是普通用户,仅分配了"is_staff"权限.

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

@permission_required('is_staff')
def my_view(....)
Run Code Online (Sandbox Code Playgroud)

@permission_required('is_staff')对匿名用户返回false.(正确)
@permission_required('is_superuser')仅对超级用户返回true(正确)
@permission_required('is_staff')对于分配了'is_staff'perm的用户返回FALSE.(错误).

有什么想法吗?

ari*_*rie 106

is_staff不是权限,所以permission_required你可以使用:

@user_passes_test(lambda u: u.is_staff)
Run Code Online (Sandbox Code Playgroud)

要么

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

@staff_member_required
Run Code Online (Sandbox Code Playgroud)

  • `@permission_required('is_superuser')`为超级用户返回'True`,因为`@ permission_required`总是为超级用户返回'True`,无论该权限是否存在(在这种情况下不存在).这假设您使用的是默认身份验证后端. (12认同)
  • 我添加了另一个更直观的选项(staff_member_required). (2认同)
  • 我怎么能对其中任何一个说“raise_exception=True”? (2认同)

Nik*_*iev 7

对于基于类的视图,您可以添加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'),
Run Code Online (Sandbox Code Playgroud)

  • 这是_wrong_."is_staff"不是权限. (9认同)

sha*_*adi 7

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

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...
Run Code Online (Sandbox Code Playgroud)

  • 大声笑只是几天后才碰到我自己的答案...早老性痴呆症:D (3认同)
  • 大声笑再次碰到它:/ (3认同)