SpringBoot Shiro登入原始碼解析

2021-10-25 08:18:39 字數 1920 閱讀 2643

專案登入的controller截圖如下:

還是從當前執行緒取出subject物件,在啟動時候已經放置了subject物件,所以此處subject物件不為空,新建乙個usernamepasswordtoken物件,把前端使用者名稱、密碼傳遞到其建構函式中,

該物件實現了remembermeauthenticationtoken介面,有個方法isrememberme(),表示使用者是否希望記住當前登入使用者,此處我們設定為true,接著呼叫subject的

isauthenticated方法判斷使用者是否認證了,如果沒有認證則呼叫subject的login方法,subject的login方法執行流程如下:

用defaultwebsecuritymanager的login方法把自己傳入進去,接著呼叫到modularrealmauthenticator物件的doauthenticate,判斷當前realm的數量,當前專案的例子只有乙個realm,所以

呼叫到dosinglerealmauthentication,繼續呼叫到realm的實現類getauthenticationinfo()方法,我的專案realm的實現類是myshirorealm實現了authorizingrealm的認證(dogetauthenticationinfo)和授權(dogetauthorizationinfo)方法,截圖如下:

首先從usernamepasswordtoken物件獲取前端傳遞的使用者名稱、密碼去資料庫查詢是否有該使用者存在,如果沒有該使用者返回空物件,對當前使用者名稱進行鹽值加密得到乙個鹽值,此時會進入catch**塊,丟擲authenticationexception異常,返回到登入頁面,如果存在該

使用者,構造乙個******authenticationinfo物件,把鹽值、使用者名稱資訊傳遞到建構函式返回,後續通過鹽值比對密碼,感興趣的可以看一下相關的**,此處不分析那塊的**。

此時呼叫defaultwebsecuritymanager的createsubject的方法,截圖如下:

先建立乙個subjectcontext物件,把認證字段設定為已認證,設定認證登入成功以後的******authenticationinfo物件,呼叫createsubject方法重新建立乙個subject,這個方法在springboot shiro啟動時候已經分析了,大概流程就是把

subjectcontext的session、是否認證等字段設定到subject物件上,返回乙個認證登入成功的subject物件,接著呼叫defaultwebsecuritymanager的onsuccessfullogin方法,如果使用者設定了記住我的功能,則把cookie寫回到瀏覽器進行儲存,下次即使關閉瀏覽器重新登入只要不是需要重新認證的都可以正常訪問頁面。

總結:shiro封裝使用者提交的使用者名稱、密碼到usernamepasswordtoken物件,呼叫自定義驗證使用者名稱、密碼的業務邏輯,如果驗證通過跳整到業務邏輯指定的url位址,如果驗證不通過調整到登入頁面。

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...

使用者登入原始碼

一 實現功能 1.是否允許同一使用者登入 2.同一使用者登入強制下線 二 功能說明 1.使用者在登入到系統前判斷當前使用者名稱是否登入 是否允許同一使用者名稱登入 同一使用者名稱登入是否踢出相同使用者 2.系統利用session儲存當前使用者名稱和登入時間完成以上功能 3.系統沒有使用任何資料和xm...