认证组件
一、认证介绍
只有认证通过才能访问到指定的url地址,比如增删改查的操作
二、局部使用(authentication_classes = [])
-
models层:
class User(models.Model): name = models.CharField(max_length=16) pwd = models.CharField(max_length=16) user_type = models.IntegerField(choices=((1, 'super_admin'), (2, 'primary_admin'), (3, 'user')),default=3) # 定义一个token class Token(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=32)
-
新建的认证文件:返回一个元组(user,token)
class MyAuth(BaseAuthentication):
# 返回一个元组(user,token)
def authenticate(self, request):
# 写一些认证逻辑
token = request.GET.get('token')
token_obj = models.Token.objects.filter(token=token).first()
print(token_obj)
if token_obj:
# 对象存在标识登录成功
return token_obj.user,token_obj.token
else:
# 对象不存在抛出错误信息
raise AuthenticationFailed('没有登录')
- 视图层
# 查看数据接口:需要经过认证
class Books(APIView):
# 局部认证
authentication_classes = [MyAuth,]
permission_classes = [Mypermision,]
def get(self,request):
return Response('返回了所有书籍')
# 登录接口:
class Login(APIView):
authentication_classes = []
def post(self, request):
back_dic = {
'code': 100,
'msg': '登录成功'
}
user = request.data.get('name')
print(user)
pwd = request.data.get('pwd')
print(pwd)
try:
user_obj = models.User.objects.filter(name=user, pwd=pwd).get()
# 登录成功,生成一个token的值
token = uuid.uuid4()
models.Token.objects.update_or_create(user=user_obj, defaults={'token': token})
back_dic['token'] = token
except ObjectDoesNotExist as e:
back_dic['code'] = 101
back_dic['msg'] = '用户名或者密码错误'
except Exception as e:
back_dic['code'] = 102
back_dic['msg'] = str(e)
return Response(back_dic)
三、全局使用
-
需要在setting 中配置
REST_FARMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ["app01.myauth.MyAuth"] }
-
局部禁用:authentication_classes = []登录接口:
class Login(APIView):
authentication_classes = []def post(self, request): back_dic = { 'code': 100, 'msg': '登录成功' }
四、读源码
配置文件写法
五、总结
-
写一个认证类,继承BaseAuthentication
class MyAuth(BaseAuthentication): def authenticate(self,request): #写一些认证的逻辑 # print('我是认证类中的方法,只要配置了,一定会走我') token=request.GET.get('token') token_obj=models.Token.objects.filter(token=token).first() if token_obj: #有值表示登录了 #token_obj.user 当前登录的user对象 return token_obj.user,token_obj else: #没有值,表示没有登录,抛异常 raise AuthenticationFailed('您没有登录')
-
局部使用
-
在视图类中写
authentication_classes=[MyAuth,]
-
-
全局使用
-
在settings.py中配置
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",] }
-
-
局部禁用
-
在视图类中写
authentication_classes = []
-