通過django_cas_ng怎麼完成登錄的呢???

環境介紹

  • cas插件使用的是django_cas_ng 3.6.0
  • pyhton 3.7.3
  • django 2.2.3

先看看 cas的工作流程

借用大哥的一張圖
在這裏插入圖片描述
假設A、B系統對接了一個cas:

  • 登錄A系統

 1. 當請求到了A系統的程序,首先經過的應該是cas_client,cas_client發現你的請求沒有ticket,就重定向到cas的地址進行登錄也就是輸入用戶和密碼的頁面(重定向會記錄跳轉前的地址)
 2.登錄完成後,cas_server爲A辦法TGC和TGT(第一步要的ticket),同時會緩存TGC到cookie裏(server和path都是訪問casserver的路徑)
 3.跳轉回A服務,此時會帶上ticket,cas_client拿着ticket去cas_server去驗證,這個ticket是不是有效的,如果有效,就會在服務端產生一個session,然後在瀏覽器產生一個cookie(A系統的地址和路徑)。 然後把對應的資源返回給瀏覽器,你就能享受A系統的服務了
 4.再次訪問A服務,此時會帶上cookie,cas_client根據這個cookie就知道你已經登錄了,然後就會返回A的資源
  • 登錄B系統
1.登錄B時,不會使用A的cookie,所以就兩手空空的到達了cas client,然後cas client會重定向到cas_server,而此時由於之前的TGC已經緩存到了瀏覽器,所以此時訪問cas_server會帶上TGC。 cas_server拿到tgc後,就知道已經登錄了。
2.然後給B頒發一個TGT,然後重定向到B系統帶上TGT,此時cas_client拿到這個tgt後,去cas那邊驗證一下。如果有效,就會在服務端產生一個session,然後在瀏覽器產生一個cookie(B系統的地址和路徑)。然後把對應的資源返回給瀏覽器,你就能享受B系統的服務了
3.再次訪問B服務,此時會帶上cookie,cas_client根據這個cookie就知道你已經登錄了,然後就會返回B的資源

如果你還是沒有看明白,可以看一下大神的文章:

  • https://www.cnblogs.com/codestory/p/5512104.html
  • https://www.cnblogs.com/lihuidu/p/6495247.html

django_cas在這個過程中做了什麼呢

  • 第一次登錄
    在這裏插入圖片描述
1、backend是我們在setting文件中指定的,我們有可能會有很多,django會拿着入參和backend的函數比較,看看那個backend能使用這個入參
代碼的位置:django\contrib\auth\__init__.py 的 authenticate函數
2、不出意外會調用到django_cas_ng的CASBackend,CASBackend會去cas server進行TGT驗證,驗證通過後會在auth_user表中創建一條記錄
代碼的位置:site-packages\django_cas\backends.py 的CASBackend

auth_user表
在這裏插入圖片描述

  • 繼續
    在這裏插入圖片描述
1、首次登陸時request.user,是被賦予了一個AnonymousUser,AnonymousUser的is_authenticated方法是返回false的。登陸後創建的user的is_authenticated是返回true的
2、django_cas_ng_sessionticket表是在登出的時候使用的,根據sessionid(cookie)獲取TGT,然後帶着TGT去cas server去做登出操作
3、當再次登錄的時候,django的session Middleware會根據cookie中的sessionid創建一個user用戶,並賦值給request.user。所以我們在使用request.user.is_authenticated()的時候,就會返回True,也就登錄成功了

如果對本文有疑問或者發現不對的地方,希望能給予評論或者進羣630300475,討論一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章