如何将视图限制为超级用户?

时间:2013-04-14 10:38:20

标签: django

view.py

@login_required
@permission_required('is_superuser')
def score_reset(request):
   pass

url.py

url(r'^score-reset/$', score_reset, name='score-reset'),    

我有以下代码,令我惊讶的是,尽管使用非超级用户登录,我仍然可以使用该功能。我当时希望获得许可。

我错过了什么?

6 个答案:

答案 0 :(得分:39)

is_superuser不是权限,它是用户模型的属性。 Django已经有另一个decorator you can make use of called user_passes_test来执行此检查:

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser)
def score_reset(self,...):
    ...

答案 1 :(得分:3)

以上答案似乎适用于早期版本的django。 它们比较晚的版本有点复杂

对于django 1.11这里有点类似但更简单的策略。

views.py

from django.contrib.auth.decorators import login_required

@login_required
def some_view(request):
if request.user.is_superuser:
    //allow access only to superuser
    return render(request, 'app/template1.html', args)
else:
    //allow access only to user
    return render(request, 'app/template2.html', args)

答案 2 :(得分:1)

如果要对许多视图执行此检查,

@user_passes_test不是一个优雅的解决方案。 您可以轻松编写自己的decorathor,例如@staff_member_require。

Here您可以看到其中一种可能的解决方案。

答案 3 :(得分:0)

您可以使用用户通过测试装饰器来限制您想要的任何访问方式。这是基于用户电子邮件示例的限制:

from django.contrib.auth.decorators import user_passes_test

def email_check(user):
    x = False
    if user.email == 'anyemailhere':
        x = True
    return x

# Create your views here.
@user_passes_test(email_check)
def dash_index(request):
    ...

更多https://docs.djangoproject.com/en/2.1/topics/auth/default/#the-permission-required-decorator

答案 4 :(得分:0)

充分利用Django的UserPassesTestMixin

创建自定义混音SuperuserRequiredMixin

#mixins.py
from django.contrib.auth.mixins import UserPassesTestMixin

class SuperuserRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_superuser

用法

class SomeSuperUserOnlyView(SuperuserRequiredMixin, ListView):
    form_class = ExamForm
    template_name = 'exam/newexam.html'

答案 5 :(得分:0)

SuperuserRequiredMixin

另一个基于权限的 mixin。这专门用于要求用户成为超级用户。对于只有特权用户才能访问的工具非常有用。

首次安装:\theta

views.py

pip install django-braces