Shiro 多Realm時,指定登入Realm

2021-08-02 05:04:33 字數 2283 閱讀 5085

之前寫過多realm登入前後臺區分問題,實現了當時的需求,可是再下一步的時候,角色與許可權校驗會失效。為了滿足當時的專案需求,又拓展了鑑權源,以及若干功能類。在本人看來,這種方式很low,玷汙了shiro。

現在有乙個較好的方式去實現前後臺的認證與鑑權。通過自定義token類來達到鑑別目的。

shiro使用token作為認證的物件。 在filter中攔截登入資訊建立token呼叫登入,或者我們自己在控制器中手動登入。呼叫登入,會迭代配置的realm進行驗證。

formauthenticationfilter中建立token的方法

最終呼叫到它的父類authenticatingfilter

shiro在進行登入驗證時候,會檢查realm是否支援該token,如果不支援跳過當前realm,繼續下乙個realm。

public class getauthenticationtokenclass() 

//是否支援該token

//realm支援的類可以是token的子類或相同

public

boolean

supports(authenticationtoken token)

自定義realm一般會繼承authorizingrealm來支援登入的驗證。

我們可以重寫public class getauthenticationtokenclass()來支援我們的token。

shiro的usernamepasswordtoken原始碼

public

class

usernamepasswordtoken

implements

hostauthenticationtoken, remembermeauthenticationtoken

public

usernamepasswordtoken(final string username, final

char password)

public

usernamepasswordtoken(final string username, final string password, final string host)

public object getprincipal()

public object getcredentials()

public string gethost()

public

void

sethost(string host)

public

boolean

isrememberme()

public

void

setrememberme(boolean rememberme)

public

void

clear()

this.password = null;}}

}

usernamepasswordtoken實現了authenticationtoken(認證)、hostauthenticationtoken(使用者ip)、remembermeauthenticationtoken(記住我)介面。

authenticationtoken

public

inte***ce

authenticationtoken

extends

serializable

由於realm檢查是否支援token類的是允許支援驗證子類的,我們不能去繼承usernamepasswordtoken,需要自己實現乙個token。直接拷貝**,修改類名就可以。或者根據你的業務需求,重寫一部分功能。

每乙個自定義realm對應支援一種token。就可以使登入驗證時不會重複呼叫realm多次驗證和異常訊息的覆蓋。

Shiro 六 多Realm驗證

在com.dw.shiro.realms下建立secondrealm 驗證方式改為sha1驗證 1.secondrealm 如下 public class secondrealm extends authenticatingrealm 5.根據使用者資訊的情況,決定是否丟擲其他異常if monste...

Shiro 多Realm驗證和認證策略 七

檢視源 modularrealmauthenticator類 再新增乙個secondshirorealm類 修改,用使用者名稱作為鹽值哦 object credentials null if mike equals username else if admin equals username c r...

shiro多Realm第一次呼叫不生效問題

1.由於最近自己寫的乙個專案上用到了多realm的使用,遇到了乙個這樣的問題 1.自己繼承了basichttpauthenticationfilter,實現了獲取token,然後直接請求api的方法,但是每次第一次呼叫的時候都是無效的,第二次請求又是正常的。以下為配置檔案 bean public s...