一、JWT Token配置
1、下载djangorestframework-jwt
pip install djangorestframework-jwt
2、settings.py指定使用的认证类JSONWebTokenAuthentication
REST_FRAMEWORK = {
# 指定使用的认证类
# a、在全局指定默认的认证类(认证方式)
'DEFAULT_AUTHENTICATION_CLASSES': [
# 1、指定jwt token认证
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
],
}
3、重写jwt_response_payload_handler方法
原因是:Django系统提供的这个方法只返回了token值,并没有返回用户id和用户名称,需要重写该方法
def jwt_response_payload_handler(token,user=None,response=None):
'''自定义JWT认证成功之后返回的响应格式'''
return {
'id':user.id, #返回登录用户的id
'username':user.username, #用户名
'token':token
}
4、JWT配置
还得在settings.py文件中指定token失效时间和指定访问路径,目的是:让项目运行时找到自己重写的方法;
import datetime
# JWT配置
JWT_AUTH = {
# 指定token失效时间为1天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# 使用自己的jwt_response_payload_handler,目的是响应结果中可以返回用户名和id
'JWT_RESPONSE_PAYLOAD_HANDLER': 'erp_project.utils.jwt_handler.jwt_response_payload_handler',
}
5、配置路由
from django.urls import path,re_path,include
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
re_path(r'^user/login/$',obtain_jwt_token), #以/结尾 JWT签发和认证token的视图类
]
访问http://127.0.0.1:8000/api/user/login/即可进行测试
二.重写用户认证
Django系统自带的用户认证不符合要求,需要重写
1、单独写个py文件
from django.contrib.auth.backends import ModelBackend
from .models import UserModel
import logging
logger = logging.getLogger('erp')
class UserLoginAuth(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
"""
实现用户认证
"""
try:
user = UserModel.objects.get(username=username)
logger.info(user)
except:
return None
#判断密码
if user.check_password(password):
return user # 把user对象放到request对象中
2、指定自定义的认证类
AUTHENTICATION_BACKENDS=['erp_system.user_auth.UserLoginAuth']
三、用户认证的权限的提供
AllowAny:允许所有用户
IsAuthenticated:允许认证通过的用户
IsAdminUser:仅限管理员用户
IsAuthenticatedOrReadOnly:认证通过的用户可以完全操作,否则只能get操作
四、配置用户认证权限
1、在配置文件中配置权限
全局配置:所有的接口都按照这种配置的方式
如果不配置任何的权限,默认使用AllowAny的认证方式
REST_FRAMEWORK = {
# 指定使用的认证类
# a、在全局指定默认的认证类(认证方式)
'DEFAULT_AUTHENTICATION_CLASSES': [
],
}
2、在具体视图类中通过permission_classes属性来设置
例如菜单视图类中,定义的permission_classes类属性
class MenuView(ModelViewSet):
queryset = MenuModel.objects.filter(delete_flag=0).all()
serializer_class = MenuSerializer
permission_classes = [IsAuthenticated]