首页 > 其他分享 >自定义jwt的登录/验证/权限

自定义jwt的登录/验证/权限

时间:2023-02-11 15:55:45浏览次数:39  
标签:obj 自定义 jwt token user time 权限 payload

jwt的登录/验证/权限

编写登录功能,登录成功后签发token

视图类----------------------------
from rest_framework_jwt.settings import api_settings
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
 1.# 调用jwt源码中的编码功能


from .jwt import jwt_payload_handler
2.# 导入我们自定义自己编写的payload方法

class UserView(ViewSet):
    @action(methods=['POST'], detail=False)
    def login(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user_obj = UserInfo.objects.filter(username=username, password=password).first()
        if user_obj:
            user_obj.last_time = datetime.datetime.now()
            # 添加用户最后登录时间
            user_obj.save()
            payload = jwt_payload_handler(user_obj)
           3. # 编写payload_handler在载体中的信息,可以自定义
            user_token = jwt_encode_handler(payload)
           4. # 通过encode_handler方法 生成token
            return Response({'code': 100,
                             'msg': '登录成功',
                             'token': user_token,
                             'username': user_obj.username})
            # 完成签发 这样登录成功就会拥有token
        else:
            return Response('用户名或密码错误')
          

自定义token内数据

 -------------自定义payload方法内信息
def jwt_payload_handler(user):
    return {'user_id': user.pk,
            'username': user.username,
            'out_time':time.time()+3600}
    # 目前我在里面填写了 用户id 用户名 过期时间 
    # 过期时间我目前设置为3600秒
    
# 重新编写这个方法,自定义返回的内容

编写认证功能 认证类

1.创建一个认证类文件


from rest_framework_jwt.utils import jwt_decode_handler
1.# 调用jwt源码中的解码功能
from .models import UserInfo
import time


class JsonWebTokenAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.META.get('HTTP_TOKEN')
        2.# 拿到前端传递token
        if token:
            try:
                payload = jwt_decode_handler(token)
               3. # 通过解码功能 解码 得到token载体中的数据
                list_time = payload.get('out_time')
               4. # 拿到我们自定的过期时间
                assert list_time > time.time()
               5. # 断言没有过期 
                user_obj = UserInfo(pk=payload.get('user_id'))
               6. # 拿到我们载体中的用户id 构建一个对象 
                  # 这个对象里面只有一个方法 就是id
                return user_obj, token
               7. # 这里返回的什么 request.user 拿到的就是什么
            except Exception:
                raise AuthenticationFailed('token认证失败或已过期')
               # 当token不对 获取过期都会直接抛异常
        else:
            raise AuthenticationFailed('请重新登录账户,暂无token')
		
    
    
认证类编写完毕 给需要登录的功能加上即可
  

编写权限功能 权限类

from rest_framework.permissions import BasePermission
from .models import UserInfo


class BooksPermissions(BasePermission):
    def has_permission(self, request, view):
        user_obj = UserInfo.objects.filter(pk=request.user.get('id')).first()
        # 由于我们认证类返回的是字典,所以通过request.user.get('id')拿到id
        # 拿到用户对象再判断id
        if user_obj.user_type == '1':
          # 判断用户权限
            return True
        else:
            self.message = '权限不足'
            return False

标签:obj,自定义,jwt,token,user,time,权限,payload
From: https://www.cnblogs.com/moongodnnn/p/17111828.html

相关文章