配置多個 Realm 我感覺是有很多好處的,比如說可以在第一個 realm 中的數(shù)據(jù)源設(shè)置為緩存, 那么就可以先去緩存中查用戶,查不到再去數(shù)據(jù)庫中查,對吧,或者說我這個項目就配有多數(shù)據(jù)源,就可以一個一個庫去查啦,暫時想到就這么多.
項目地址:https://github.com/thecattle/spring-mvc-shiro
可以看到這里沒有直接在securityManager里配置 realm 參數(shù),而是直接配置authenticator參數(shù),是在這里向ModularRealmAuthenticator類注入 realms 參數(shù),都在注釋里.
要注意的是authenticationStrategy參數(shù):
- AllSuccessfulStrategy:所有 realm 全部認證通過才算登錄成功
- FirstSuccessfulStrategy:驗證某個 realm 成功后直接返回,不會驗證后面的 realm 了
- AtLeastOneSuccessfulStrategy:所有的 realm 都會驗證,其中一個成功,也會繼續(xù)驗證后面的 realm,最后返回成功
下面的otherRealm類和myRealm是自定義的realm,需要繼承AuthorizingRealm.
otherRealm:普通認證的 realm
myRealm:加密認證的 realm
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--配置 session 管理-->
<property name="sessionManager" ref="sessionManager"></property>
<!--配置 記住我-->
<property name="rememberMeManager" ref="rememberMeManager"></property>
<!-- 配置多個Realm的登錄認證 -->
<property name="authenticator" ref="authenticator"></property>
</bean>
<!-- 配置多個Realm -->
<bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
<!--驗證的時候,是用迭代器,所以可以認為驗證的順序就是這個 list 的順序-->
<property name="realms">
<list>
<ref bean="otherRealm"/>
<ref bean="myRealm"/>
</list>
</property>
<property name="authenticationStrategy">
<!--所有 realm 認證通過才算登錄成功-->
<!--<bean id="authenticationStrategy" class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"/>-->
<!--驗證某個 realm 成功后直接返回,不會驗證后面的 realm 了-->
<!--<bean id="authenticationStrategy" class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy"/>-->
<!--所有的 realm 都會驗證,其中一個成功,也會繼續(xù)驗證后面的 realm,最后返回成功-->
<bean id="authenticationStrategy" class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"/>
</property>
</bean>
<!--自定義 MyRealm,登錄的認證入口 ,需要繼承AuthorizingRealm,項目中會體現(xiàn)-->
<bean id="myRealm" class="com.sunp.shiro.MyRealm">
<!-- 配置密碼匹配器 -->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!-- 加密算法為SHA-256 -->
<property name="hashAlgorithmName" value="SHA-256"></property>
<!-- 加密迭代次數(shù) -->
<property name="hashIterations" value="1024"></property>
<!--是否存儲散列后的密碼為16進制,為 true:.toHex(),為 false:.toBase64()-->
<property name="storedCredentialsHexEncoded" value="false"></property>
</bean>
</property>
</bean>
<!--自定義的第二個 realm-->
<bean id="otherRealm" class="com.sunp.shiro.OtherRealm"></bean>
OtherRealm:

image.png
MyRealm:

image.png
今天感覺好累啊 也不知道寫什么了,先到這