如何仅限超级用户查看?

Posted

技术标签:

【中文标题】如何仅限超级用户查看?【英文标题】:How to limit a view to superuser only? 【发布时间】:2013-04-06 13:28:42 【问题描述】:

view.py

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

url.py

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

我有以下代码,令我惊讶的是,尽管使用非超级用户登录,但我仍然点击了该功能。我期待获得被拒绝的权限。

我错过了什么?

【问题讨论】:

【参考方案1】:

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,...):
    ...
allowing only super user login Django is_staff permission decorator

【讨论】:

顺便说一句,我没有将此标记为重复,因为我没有链接到提到user_passes_test 是现有的 django 装饰器以及is_superuser 不是权限 问题要求仅限于超级用户。示例代码应该是@user_passes_test(lambda u: u.is_superuser) 使用user_passes_test [上面的 sn-p] 可以完成工作。但是您可能要考虑这将重定向到所有非超级用户的登录页面,即使他们已经登录in.您可能想编写自己的装饰器来完成工作。【参考方案2】:

以上答案似乎适用于非常早期的 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)

【讨论】:

【参考方案3】:

@user_passes_test 如果您想对许多视图执行此检查,这不是一个优雅的解决方案。 您可以轻松编写自己的装饰器,例如 @staff_member_require。

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

【讨论】:

【参考方案4】:

利用Django的UserPassesTestMixin

创建自定义 mixin 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】:

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

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

【讨论】:

【参考方案6】:

SuperuserRequiredMixin

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

首次安装:pip install django-braces

views.py

from braces.views import LoginRequiredMixin, SuperuserRequiredMixin


class SomeSuperuserView(LoginRequiredMixin, SuperuserRequiredMixin, TemplateView):
    template_name = "path/to/template.html"

【讨论】:

以上是关于如何仅限超级用户查看?的主要内容,如果未能解决你的问题,请参考以下文章

Linux查看当前用户是不是是超级管理员用户和Linux删除用户

linux无法切换到超级用户

尽管没有超级用户,如何在 MYSQL 中向(root)用户授予超级权限?

阿里云超级周拼团活动开始了

阿里云超级周拼团活动开始了

Django Admin Cookbook-17如何仅限特定用户登录Django Admin管理后台