认证组件:rest_framework 的里面的APIView里面的
所有都是先从全局,然后到局部找(加入局部有就会覆盖掉全局的),再找不到就会找默认的;
全局认证:在settings里面配置以下信息
REST_FRAMEWORK = { # 认证 'DEFAULT_AUTHENTICATION_CLASSES': [ 'app01.utils.auth.TokenAuth' ], }
局部认证:在视图类下面写以下内容 加入全局设置了,
然后视图下面需要打开验证的话直接把列表内容清空就可以了;
authentication_classes = [TokenAuth, ]
为token生成一个当前时间+用户名md5加密的随机字符串
def get_random_str(user): import hashlib, time ctime = str(time.time()) md5 = hashlib.md5(bytes(user, encoding='utf8')) md5.update(bytes(ctime, encoding='utf8')) return md5.hexdigest()
authToken认证: 检测访问用户是否是带有token字符串的用户,且校验数据库Token表的记录;
成功返回用户名和token表对象,失败返回rest_framework.exceptions的AuthenticationFailed的报错格式;
# token认证 class TokenAuth(BaseAuthentication): def authenticate(self, request): token = request.GET.get('token', None) token_obj =UserToken.objects.filter(token=token).first() if token_obj: return token_obj.user.user, token_obj else: raise AuthenticationFailed("认证失败!")
Login视图:
在login里面加入auth认证
from app01.utils.auth import TokenAuth
class LoginView(APIView):
# authentication_classes = [TokenAuth, ] # 把我写好的认证组件放进 authentication_classes 列表里面 def post(self, request): res = {'code': 1000, 'msg': None} try: user = request.data.get('user') pwd = request.data.get('pwd') user_obj = User.objects.filter(user=user, pwd=pwd).first() print(user_obj) if not user_obj: res['code'] = 1001 res['msg'] = '用户名或者密码错误' else: # 创建新的token字符串 token = get_random_str(user) # 更新或者创建如果有user就更新,没有就创建 UserToken.objects.update_or_create(user=user_obj, defaults={'token': token}) res['token'] = token except Exception as e: res['code'] = 1002 res['msg'] = str(e) return JsonResponse(res, json_dumps_params={'ensure_ascii': False})
权限组件
全局权限:
# rest_framework默认权限 都通过 # 'DEFAULT_PERMISSION_CLASSES': ( # 'rest_framework.permissions.AllowAny', # ) # 自定义权限 仅限auth认证后的用户且是SVIP的才通过 'DEFAULT_PERMISSION_CLASSES': ( 'app01.utils.permissions.SVIPPermission', )
局部权限:
# 把权限放开 permission_classes = []
自定义权限:
# 自定义权限认证 class SVIPPermission(object): message = '没有访问权限,请充值超级会员' def has_permission(self, request): # auth认证里面找到user对象的type字段值 has_vip = request.auth.user.type if has_vip == 3: return True else: return False
默认权限:
from rest_framework.permissions import AllowAny class SVIP(AllowAny): pass
频率组件