【问题标题】:Django Authentication processDjango 身份验证过程
【发布时间】:2015-01-24 12:07:47
【问题描述】:

我注意到当我以管理员身份登录时,访问非管理员区域时不需要重新验证。

但是,当我以简单用户身份登录并访问管理区域时,Django 当然会检查我是否是管理员。

这个检查发生在哪里?我想限制版主访问网站的非管理部分,所以需要检查一下。 谢谢。

【问题讨论】:

    标签: django django-admin django-authentication


    【解决方案1】:

    使用@user_passes_test 装饰器:

    from django.contrib.auth.decorators import user_passes_test
    
    def not_staff_user(user):
        return not user.is_staff
    
    @user_passes_test(not_staff_user)
    def my_view(request):
        ...
    

    如果您想限制除/admin/ 之外的所有页面,那么中间件是一个不错的选择:

    from django.conf import settings
    from django.shortcuts import redirect
    
    class NonStaffMiddleware(object):
    
        def process_request(self, request):
            if request.user.is_staff and not \
                   (request.path.startswith('/admin/') or
                    request.path.startswith(settings.LOGIN_URL) or
                    request.path.startswith(settings.LOGOUT_URL)):
                return redirect(settings.LOGIN_URL)
    

    【讨论】:

    • 不是很方便,因为我需要在每个视图中检查它。我认为应该在中间件中进行更改。
    • 这并不能解决问题,因为重定向到登录页面不会注销。不过,我明白了。另外,我不喜欢硬编码 request.path.startswith('/admin/')
    【解决方案2】:

    您可以在视图或模板中使用user.is_staffuser.is_superuseruser.is_authenticated 函数来检查这一点。如果您需要在模板中执行此操作,则用户在 {{ request.user }} 中,并且在您的视图中使用 request.user

    【讨论】:

    • 不是很方便,因为我需要在每个视图中检查它。我认为应该在中间件中进行更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2017-06-03
    • 2011-09-23
    • 2013-09-09
    • 2017-02-24
    • 1970-01-01
    相关资源
    最近更新 更多