认证简介
只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件
源码分析
首先要找到认证组件
这里的request是新的request,这里的user是一个方法,包装成了数据属性
然后进入user看一下user是在Request类里的所以先要导入
from rest_framework.request import Request
authenticators是Request类初始化传过来的
然后再找Request是在哪里实例化的 是在封装的时候实例化的
这里的self就是自己里面有authenticators方法
现在视图里面
用户登录认证
model.py
class User(models.Model): name = models.CharField(max_length=32) password = models.CharField(max_length=32) user_type = models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'穷逼用户'))) class UserToken(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=64)
OneToOneField其实就是ForeignKey里面加了一个unique=True 唯一性
view.py
class Login(APIView): def post(self,request): response = {'code':100,'msg':'登录成功'} name = request.data.get('name') pwd = request.data.get('password') #get获取一条或有且只有一条的数据不会报错,否则抛异常 try: user =models.User.objects.filter(name=name,password=pwd).get() #登录成功token表存数据,如果有一条数据就更新token,没有就添加 token = uuid.uuid4() #这里面user是先把这用户名查出来,update_or_create如果能查到更新,查不到就写进去 models.UserToken.objects.update_or_create(user=user,defaults={'token':token}) response['token'] =token except ObjectDoesNotExist as e: response['code'] = 101 response['msg'] = '用户名或密码错误' except Exception as e: response['code'] = 102 response['msg'] = str(e) return Response(response)
postman这里最后面一定要加斜杆,不加就出错了
django中请求路径带斜杠和不带斜杠
-CommonMiddleware中间件
token认证是否登录
写一个认证类,继承BaseAuthentication
class MyAuth(BaseAuthentication): def authenticate(self,request): #这里可以写认证的逻辑 #用户登录之后才能访问所有的图书 #拿出请求路径token值,一般放在头当中安全些,放在请求头取值就要用meta token = request.GET.get('token') token_obj = models.UserToken.objects.filter(token=token).first() if token_obj: #有值表示登录了 return else: #没有值表示没有登录,抛异常捕获 raise AuthenticationFailed('您没有登录') def authenticate_header(self,a): pass
token不存在
如果没加authenticate_header会报错们不能返回异常捕获信息,也可以不写但是要导入
from rest_framework.authentication import BaseAuthentication
token存在
源码部分
如果再写一个视图类也要有认证功能就只要加上
authentication_classes = [MyAuth,]
局部使用
全局使用
配置好视图里面就可以不用写了
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",] }
但是这样登录视图就也要认证了!
局部禁用
直接为空列表就行了
源码部分
如果没有配authentication_classes的话就是会父类里面找也就是APIview里面找
如果在项目的setting.py中配置了REST_FRAMEWORK,默认先从项目的setting中取
-如果取不到,才去默认的drf配置文件中取
-如果用户在视图类中配置了某个,先去用户配置的取