认证是最基本的限制,根据访问者是否为有效用户,从而限制可以访问什么资源。权限是在认证基础上做的进一步限制,也就是说只有通过了认证才谈得来有什么权限,根据不同的身份,限制不同的访问。
-
1、一句
self.initial(request, *args, **kwargs)
就执行了认证、权限、频率三件事情,三件事都走完之后才往下走,执行相应的函数def initial(self, request, *args, **kwargs): 1,实现认证 self.perform_authentication(request) 2,权限判断 self.check_permissions(request) 3,控制访问频率 self.check_throttles(request)
-
2、先看认证
self.perform_authentication(request)
-
①,request.user
def perform_authentication(self, request): request.user 【在Request类里寻找user方法】 【此时的request.user是request原有的user方法,之后步骤⑥自己赋值了一个request.user是表中的user对象】
-
②,这个user方法返回了一个_user属性
@property def user(self): if not hasattr(self, '_user'): with wrap_attributeerrors(): self._authenticate() 【此句是认证关键】 return self._user
-
③,认证的全部代码。【Request类里的。】
def _authenticate(self): # 循环认证类的所有对象 for authenticator in self.authenticators: 【解析第一句】authenticator是认证类对象, 这个self是新的request对象 try: 【# 对应自己的逻辑结果,下面这句话限制了自己写的代码,如果不符合要求可以抛错,我下面给你抛出去,结束本次访问。】 ↓ user_auth_tuple = authenticator.authenticate(self) 【解析第二句】 except exceptions.APIException: 【authenticate 是自定义的 一个函数,所以自定义的一个函数里必须接收一个request参数】 self._not_authenticated() raise if user_auth_tuple is not None: 【解析第三句】 self._authenticator = authenticator self.user, self.auth = user_auth_tuple return self._not_authenticated()
-
④,解析第一句,实例化的时候:
Request(authenticators=self.get_authenticators(),) 这个方法返回一个认证类对象列表: def get_authenticators(self): 【dispatch中的视图类对象】 return [auth() for auth in self.authentication_classes] 此时就用到了自定义的认证类。 authenticator是自定义类的实例对象,authenticate是自定义类的方法,那个self是新的request对象 调方法的时候调了一个authenticate方法,所以自定义方法的名字必须叫这个。
-
⑤,解析第三句,代码意思:如果上面的执行结果不报错,就是正常可以访问,走下来,之后再判断执行的结果是什么【先看执行报不报错,不报错再看执行结果是什么】
if user_auth_tuple is not None: 【如果有返回值,也就是返回不为None,就走这一步】 self._authenticator = authenticator self.user, self.auth = user_auth_tuple 【将返回值赋值给这两个属性】 return 【直接结束】return就结束了for循环,这就限制了如果有多个认证类, 想要返回结果就必须把有返回结果的认证类放在最后 【没有返回值,才不走return】
-
-
3、
rest_framwork
里面有认证部分,只不过不写就全部通过,实际还是走认证的代码。如果我把我的认证部分的代码放进他给提供的接口里,就会按我写的认证逻辑走。意思是,我按照人家的规则放进去我自己的认证逻辑代码,人家就接收,并且按我的逻辑走。自定义认证类的使用流程
- 4、当然restframework里面还提供了一些认证类,提供了不同的认证方法。我们自己写的认证是根据token值认证,当然也可通过用户名等。
- 5、如果想要全局,所有视图都经过认证,可把这个认证类放在settings文件里,所有的视图在走自己的逻辑时必须经过找认证类这个步骤,找不到自己的里面自然会去settings里找,最后才找默认的(在此默认的是全部通过,不做约束)。
注意写好路径。REST_FRAMEWORK={ 'DEFAULT_PARSER_CLASSES': ( 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'app01.utils.auth_class.UserAuth', ), 'DEFAULT_PERMISSION_CLASSES': ( 'app名称.下的路径.权限类', ), }
网友评论