DRF部分源碼解析之認(rèn)證

認(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)限類',
        ),
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敲茄,隨后出現(xiàn)的幾起案子位谋,更是在濱河造成了極大的恐慌,老刑警劉巖堰燎,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏父,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爽待,警方通過查閱死者的電腦和手機(jī)损同,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸟款,“玉大人膏燃,你說(shuō)我怎么就攤上這事『问玻” “怎么了组哩?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)处渣。 經(jīng)常有香客問我伶贰,道長(zhǎng),這世上最難降的妖魔是什么罐栈? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任黍衙,我火速辦了婚禮,結(jié)果婚禮上荠诬,老公的妹妹穿的比我還像新娘琅翻。我一直安慰自己位仁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布方椎。 她就那樣靜靜地躺著聂抢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠众。 梳的紋絲不亂的頭發(fā)上琳疏,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音闸拿,去河邊找鬼空盼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胸墙,可吹牛的內(nèi)容都是我干的我注。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼迟隅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼但骨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起智袭,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奔缠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吼野,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體校哎,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瞳步,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闷哆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡单起,死狀恐怖抱怔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘀倒,我是刑警寧澤屈留,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站测蘑,受9級(jí)特大地震影響灌危,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碳胳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一勇蝙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挨约,春花似錦浅蚪、人聲如沸藕帜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贝攒,卻和暖如春盗誊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隘弊。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工哈踱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梨熙。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓开镣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咽扇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邪财,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容