有时候我们需要在访问页面前进行权限验证,比如有些页面是需要在登录后才能进行访问,如个人中心、我的订单等。
一.后端配置中间件
1.检验逻辑
创建一个middleware.py,在里面写上检验的逻辑
from django.http import JsonResponse
from users.models import User
class CookieAuthMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 检查请求是否为登录请求
if request.path == '/login/':
return self.get_response(request)
mobile = request.COOKIES.get('mobile')
if mobile:
try:
user = User.objects.get(mobile=mobile)
request.user = user
except User.DoesNotExist:
return JsonResponse({'detail': 'Unauthorized'}, status=401)
else:
return JsonResponse({'detail': 'Unauthorized'}, status=401)
response = self.get_response(request)
return response
对登录操作则不进行检验
2.配置中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'utils.middleware.CookieAuthMiddleware',
]
实际路径跟自己项目匹配,我是把中间件的文件放在了utils文件夹里
3.运行效果
可以看到这里未登录状态访问我的订单已经返回了401
二.前端页面跳转
然后我们在页面的js里配置响应拦截,如果检测到返回响应为401,则说明用户未登录,就给他跳转到登录界面
mounted: function(){
axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response && error.response.status === 401) {
window.location.href = 'http://127.0.0.1:8080/login.html';
} else {
return Promise.reject(error);
}
}
);}
这时我们在未登录状态下访问就会跳转到登录界面