一 简介: 用户登录的验证
二 验证机制:
1 session session需要在服务端存储能够通过session_id而获取的信息,每次请求到达服务端时,需要根据session_id这个key值,获取存储在内存/磁盘/数据库中的信息
2 token token 信息均在token里面,服务端只需要根据token中定义的算法进行解析,即可获得所需认证信息。所以一个是memory cost,一个是time cost
eg: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX3R5cGUiOjEsIm5iZiI6MTUyNjg4NjYzM30.CTZH48xD_TdtDZcgAd8exiCxkryXASruDCbRHsFFD5Y
三 JWT简介
JWT(Json Web Token)是实现token认证的一种通用标准。
四 JWT 安装与全局认证设置
1 安装插件
pip3 install djangorestframework-jwt
2 setting中全局设置进行
这里要注意,会对所有VIEW进行验证
REST_FRAMEWORK = {
# 权限认证
' DEFAULT_PERMISSION_CLASSES': (
' rest_framework.permissions.IsAuthenticated',
),
# 身份验证
' DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
' rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
五 整体使用
1 登录完成后自动生成token并返回前端
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
user = Account.objects.filter(username=username).first()
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return Response{'token':token}
注意:这里的user为django自带user表查询的queryset,必须要有
2 前端VUEX进行读取变量并存储在全局变量
3 前端vue根据全局变量构建每个api访问的request.header
if (store.getters.token) {
console.log('能进入')
config.headers['authorization'] = 'JWT ' + getToken()
}
注意:这里token格式为 jwt+token,并且authorization一定要小写
4 进行api端口测试
六 权限相关
1 默认的角色
1 AllowAny 放任一切
2 IsAuthenticated 只有验证的才能放行
3 IsAdminUser 超级管理员
4 IsAuthenticatedOrReadOnly 将允许经过身份验证的用户执行任何请求。只有当请求方法是“安全”方法(GET, HEAD 或 OPTIONS)之一时,才允许未经授权的用户请求。
2 自定义权限
要实现自定义权限,请重写BasePermission并实现以下方法中的一个或两个
.has_permission(self, request, view)
.has_object_permission(self, request, view, obj)
1 如果请求被授予访问权限,方法应该返回True,否则返回False
2 仅当视图级has_permission检查已通过时,才会调用实例级has_object_permission方法