認(rèn)證是最基本的限制,根據(jù)訪問者是否為有效用戶膳音,從而限制可以訪問什么資源。權(quán)限是在認(rèn)證基礎(chǔ)上做的進(jìn)一步限制铃诬,也就是說(shuō)只有通過了認(rèn)證才談得來(lái)有什么權(quán)限祭陷,根據(jù)不同的身份,限制不同的訪問趣席。
-
1兵志、一句
self.initial(request, *args, **kwargs)
就執(zhí)行了認(rèn)證、權(quán)限宣肚、頻率三件事情想罕,三件事都走完之后才往下走,執(zhí)行相應(yīng)的函數(shù)def initial(self, request, *args, **kwargs): 1霉涨,實(shí)現(xiàn)認(rèn)證 self.perform_authentication(request) 2按价,權(quán)限判斷 self.check_permissions(request) 3,控制訪問頻率 self.check_throttles(request)
-
2笙瑟、先看認(rèn)證
self.perform_authentication(request)
-
①楼镐,request.user
def perform_authentication(self, request): request.user 【在Request類里尋找user方法】 【此時(shí)的request.user是request原有的user方法,之后步驟⑥自己賦值了一個(gè)request.user是表中的user對(duì)象】
-
②往枷,這個(gè)user方法返回了一個(gè)_user屬性
@property def user(self): if not hasattr(self, '_user'): with wrap_attributeerrors(): self._authenticate() 【此句是認(rèn)證關(guān)鍵】 return self._user
-
③框产,認(rèn)證的全部代碼凄杯。【Request類里的秉宿〗渫唬】
def _authenticate(self): # 循環(huán)認(rèn)證類的所有對(duì)象 for authenticator in self.authenticators: 【解析第一句】authenticator是認(rèn)證類對(duì)象, 這個(gè)self是新的request對(duì)象 try: 【# 對(duì)應(yīng)自己的邏輯結(jié)果蘸鲸,下面這句話限制了自己寫的代碼妖谴,如果不符合要求可以拋錯(cuò),我下面給你拋出去酌摇,結(jié)束本次訪問膝舅。】 ↓ user_auth_tuple = authenticator.authenticate(self) 【解析第二句】 except exceptions.APIException: 【authenticate 是自定義的 一個(gè)函數(shù)窑多,所以自定義的一個(gè)函數(shù)里必須接收一個(gè)request參數(shù)】 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()
-
④仍稀,解析第一句,實(shí)例化的時(shí)候:
Request(authenticators=self.get_authenticators(),) 這個(gè)方法返回一個(gè)認(rèn)證類對(duì)象列表: def get_authenticators(self): 【dispatch中的視圖類對(duì)象】 return [auth() for auth in self.authentication_classes] 此時(shí)就用到了自定義的認(rèn)證類埂息。 authenticator是自定義類的實(shí)例對(duì)象技潘,authenticate是自定義類的方法,那個(gè)self是新的request對(duì)象 調(diào)方法的時(shí)候調(diào)了一個(gè)authenticate方法千康,所以自定義方法的名字必須叫這個(gè)享幽。
-
⑤,解析第三句拾弃,代碼意思:如果上面的執(zhí)行結(jié)果不報(bào)錯(cuò)值桩,就是正常可以訪問豪椿,走下來(lái)奔坟,之后再判斷執(zhí)行的結(jié)果是什么【先看執(zhí)行報(bào)不報(bào)錯(cuò),不報(bào)錯(cuò)再看執(zhí)行結(jié)果是什么】
if user_auth_tuple is not None: 【如果有返回值搭盾,也就是返回不為None咳秉,就走這一步】 self._authenticator = authenticator self.user, self.auth = user_auth_tuple 【將返回值賦值給這兩個(gè)屬性】 return 【直接結(jié)束】return就結(jié)束了for循環(huán),這就限制了如果有多個(gè)認(rèn)證類鸯隅, 想要返回結(jié)果就必須把有返回結(jié)果的認(rèn)證類放在最后 【沒有返回值澜建,才不走return】
-
-
3、
rest_framwork
里面有認(rèn)證部分滋迈,只不過不寫就全部通過霎奢,實(shí)際還是走認(rèn)證的代碼。如果我把我的認(rèn)證部分的代碼放進(jìn)他給提供的接口里饼灿,就會(huì)按我寫的認(rèn)證邏輯走。意思是帝美,我按照人家的規(guī)則放進(jìn)去我自己的認(rèn)證邏輯代碼碍彭,人家就接收,并且按我的邏輯走。自定義認(rèn)證類的使用流程
- 4庇忌、當(dāng)然restframework里面還提供了一些認(rèn)證類舞箍,提供了不同的認(rèn)證方法。我們自己寫的認(rèn)證是根據(jù)token值認(rèn)證皆疹,當(dāng)然也可通過用戶名等疏橄。
- 5、如果想要全局略就,所有視圖都經(jīng)過認(rèn)證捎迫,可把這個(gè)認(rèn)證類放在settings文件里,所有的視圖在走自己的邏輯時(shí)必須經(jīng)過找認(rèn)證類這個(gè)步驟表牢,找不到自己的里面自然會(huì)去settings里找窄绒,最后才找默認(rèn)的(在此默認(rèn)的是全部通過,不做約束)崔兴。
注意寫好路徑彰导。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名稱.下的路徑.權(quán)限類', ), }