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