shiro身份驗證 一

2021-10-01 16:45:46 字數 3636 閱讀 2871

>

>

>

junitgroupid

>

>

junitartifactid

>

>

4.9version

>

dependency

>

>

>

commons-logginggroupid

>

>

commons-loggingartifactid

>

>

1.1.3version

>

dependency

>

>

>

org.apache.shirogroupid

>

>

shiro-coreartifactid

>

>

1.2.2version

>

dependency

>

dependencies

>

1.、首先準備一些使用者身份/憑據(shiro.ini)

[users] 

zhang=123

wang=123

此處使用ini配置檔案,通過[user]指定了兩個主體:zhang/123、wang/123

2、測試用例

@test

public

void

testhelloworld()

catch

(authenticationexception e)

assert.

assertequals

(true

, subject.

isauthenticated()

);//斷言使用者已經登入

//6、退出

subject.

logout()

;}

2.1、首先通過 new inisecuritymanage***ctory 並指定乙個 ini 配置檔案來建立乙個securitymanager 工廠;

2.2、接著獲取 securitymanager 並繫結到 securityutils,這是乙個全域性設定,設定一次即可;

2.3、通過 securityutils 得到 subject,其會自動繫結到當前執行緒;如果在 web 環境在請求結束時需要解除繫結;然後獲取身份驗證的token,如使用者名稱/密碼;

2.4、呼叫 subject.login 方法進行登入,其會自動委託給 securitymanager.login 方法進行登入;

2.5 、 如 果 身份驗證 失敗請捕 獲 authenticationexception 或 其 子 類 , 常 見 的 如 :

disabledaccountexception(禁用的帳號)、lockedaccountexception(鎖定的帳號)、unknownaccountexception(錯誤的帳號)、excessiveattempt***ception(登入失敗次數過 多)、incorrectcredential***ception (錯誤的憑證)、expiredcredential***ception(過期的 憑證)等,具體請檢視其繼承關係;對於頁面的錯誤訊息展示,最好使用如「使用者名稱/密碼錯誤」而不是「使用者名稱錯誤」/「密碼錯誤」,防止一些惡意使用者非法掃瞄帳號庫;

2.6、最後可以呼叫 subject.logout 退出,其會自動委託給 securitymanager.logout 方法退出。

從如上**可總結出身份驗證的步驟:

1、收集使用者身份/憑證,即如使用者名稱/密碼;

2、呼叫 subject.login 進行登入,如果失敗將得到相應的 authenticationexception 異常,根據異常提示使用者錯誤資訊;否則登入成功;

3、最後呼叫 subject.logout 進行退出操作。

流程如下:

1、首先呼叫 subject.login(token)進行登入,其會自動委託給 security manager,呼叫之前必須通過 securityutils. setsecuritymanager()設定;

2、securitymanager 負責真正的身份驗證邏輯;它會委託給 authenticator 進行身份驗證;

3、authenticator 才是真正的身份驗證者,shiro api 中核心的身份認證入口點,此處可以自定義插入自己的實現;

4、authenticator 可能會委託給相應的 authenticationstrategy 進行多 realm 身份驗證,預設modularrealmauthenticator 會呼叫 authenticationstrategy 進行多 realm 身份驗證;

5、authenticator 會把相應的 token 傳入 realm,從 realm 獲取身份驗證資訊,如果沒有返 回/丟擲異常表示身份驗證失敗了。此處可以配置多個 realm,將按照相應的順序及策略進行訪問。

realm:域,shiro 從 realm 獲取安全資料(如使用者、角色、許可權),就是說 securitymanager要驗證使用者身份,那麼它需要從 realm 獲取相應的使用者進行比較以確定使用者身份是否合法;也需要從 realm 得到使用者相應的角色/許可權進行驗證使用者是否能進行操作;可以把 realm 看 成 datasource 即安全資料來源 。如我們之前的ini配置方式將使用 org.apache.shiro.realm.text.inirealm。

public

class

myrealm1

implements

realm

@override

public

boolean

supports

(authenticationtoken token)

@override

public authenticationinfo getauthenticationinfo

(authenticationtoken token)

throws authenticationexception if(

!"123"

.equals

(password)

)//如果身份認證驗證成功,返回乙個 authenticationinfo 實現;

return

new******authenticationinfo

(username, password,

getname()

);}}

2、ini 配置檔案指定自定義 realm 實現(shiro-realm.ini)

# 宣告乙個 realm 

myrealm1=com.github.zhangkaitao.shiro.chapter2.realm.myrealm1

# 指定 securitymanager 的 realms 實現

securitymanager.realms=$myrealm1

通過$name 來引入之前的 realm 定義。

一 Shiro 身份驗證

一.shiro 身份驗證 principals 身份,即主體的標識屬性,可以是任何東西,如使用者名稱 郵箱等,唯一即可。乙個主體可以有多個 principals,但只有乙個 primary principals,一般是使用者名稱 密碼 手機號。credentials 證明 憑證,即只有主體知道的安全...

Shiro 二 身份驗證基本流程

簡介 在 shiro 中,使用者需要提供 principals 身份 和 credentials 證明 給 shiro,從而應用能驗證使用者身份 principals 身份,即主體的標識屬性,可以是任何東西,如使用者名稱 郵箱等,唯一即可。乙個主體可以有多個 principals,但只有乙個 pri...

Forms 身份驗證

配置應用程式使用 forms 身份驗證 如果應用程式的根目錄中有 web.config 檔案,請開啟該檔案。複製 在system.web元素中,建立乙個authentication元素,並將它的mode屬性設定為 forms,如下面的示例所示 複製 在authentication元素中,建立乙個fo...