Django强制登录‘用户身份验证:jwt token

本文介绍了在Django项目中如何自定义中间件进行用户身份验证,通过检查请求头中的JWT token来获取并保存用户信息。同时,展示了如何使用装饰器实现类似的功能,确保用户已登录。在Vue前端,通过axios请求时携带token,以实现前后端交互的安全认证。
摘要由CSDN通过智能技术生成

(1)自定义中间件的方法

django项目跟目录下新建文件middleware, -> 新建middleware.py

# setting中配置中间件

MIDDLEWARE = [
        'middleware.middleware.CheckUserMiddleware',
]
import jwt
from django.utils.deprecation import MiddlewareMixin
 
# 自定义中间件
from project1 import settings
 
 
class CheckUserMiddleware(MiddlewareMixin):
    def process_request(self, request):
        # 注意:以后需要的身份认证的请求,都将身份认证信息(jwt)添加在请求头中
        # 请求头的解析方式request.headers.get('token')
        token = request.headers.get('token')
        # 2.判断token是否存在
        # 给request增加一个字段user_info, 保存用户信息
        if not token:
            request.user_info = None
        # 3.token存在,解析token中的内容
        else:
            payload = jwt.decode(token, key=settings.SECRET_KEY, algorithms='HS256')
            # 4.保存解析到的用户信息
            request.user_info = payload

中间件在视图中的用法:

中间件在视图中的用法

class UserCenter(APIView):
    def put(self, request):
        try:
            user_info = request.user_info
            user = User.objects.get(id=user_info.get("id"))
        except Exception as e:
            print(e)
            return Response({"code": 204, "msg": "用户未登录或不存在"})

(2)用户强登装饰器

class OrderInfo(APIView):
    @check_login    #装饰器加在要装饰的函数上面
    def get(self, request):
        request.user_id    # 用户id
        request.user    # 用户模型类对象
import jwt
from rest_framework.response import Response

from p9_s import settings
from user.models import User


def check_login(func):
    def wrapper(self, request, *args, **kwargs):
        token = request.headers.get('token')
        try:
            payload = jwt.decode(token, key=settings.SECRET_KEY, algorithms='HS256')
        except:
            return Response({
                'code': 403, 'msg': '用户未登录'
            })
        request.user_id = payload.get('user_id')
        request.user = User.objects.filter(id=request.user_id).first()
        return func(self, request, *args, **kwargs)

    return wrapper

 vue#########

前端请求中 给一个token的携带参数


this.$axios
      .get("/goods/user/collection/", {    //请求头携带一个token数据
        headers:{'token':localStorage.getItem("token")||"", platform:"web"}
      })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值