Django 认证过程
Django Authentication process
我注意到当我以管理员身份登录时,访问非管理区域时不需要重新验证。
但是,当我以简单用户身份登录并访问管理区域时,Django 当然会检查我是否是管理员。
这个检查发生在哪里?我想限制版主访问网站的非管理部分,所以需要检查一下。
谢谢。
您有 user.is_staff, user.is_superuser and user.is_authenticated 功能来检查您的视图或模板中是否存在此问题。如果您需要在您的模板中执行此操作,用户在 {{ request.user }}
中并且也在您的视图中 request.user
。
使用 @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)
我注意到当我以管理员身份登录时,访问非管理区域时不需要重新验证。
但是,当我以简单用户身份登录并访问管理区域时,Django 当然会检查我是否是管理员。
这个检查发生在哪里?我想限制版主访问网站的非管理部分,所以需要检查一下。 谢谢。
您有 user.is_staff, user.is_superuser and user.is_authenticated 功能来检查您的视图或模板中是否存在此问题。如果您需要在您的模板中执行此操作,用户在 {{ request.user }}
中并且也在您的视图中 request.user
。
使用 @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)