1.多realm验证,那么首先肯定是有多个自定义realm,然后在返回的SimpleAuthenticationInfo()对象是一样的,只不过在需要在IOC容器中多配置一步。这里以MD5和SHA1为例。
注入自定义realm的Bean
<bean id="jdbcRealm" class="com.test.shiro.realm.ShiroRealm">
<!--凭证匹配器,指定加密方式及加密次数-->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--指定加密算法,指定之后前台传的参数就会自定按照指定的加密算法加密-->
<property name="hashAlgorithmName" value="MD5"/>
<!-- 指定循环加密次数 -->
<property name="hashIterations" value="1024"/>
</bean>
</property>
</bean>
<bean id="secondRealm" class="com.test.shiro.realm.SecondRealm">
<!--凭证匹配器,指定加密方式及加密次数-->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--指定加密算法,指定之后前台传的参数就会自定按照指定的加密算法加密-->
<property name="hashAlgorithmName" value="SHA1"/>
<!-- 指定循环加密次数 -->
<property name="hashIterations" value="1024"/>
</bean>
</property>
</bean>
多个realm配置为一个认证器
<!-- 多realm认证器 -->
<bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
<property name="realms">
<list>
<ref bean="jdbcRealm"/>
<ref bean="secondRealm"/>
</list>
</property>
</bean>
再把认证器配置到
securityManager
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="cacheManager" ref="cacheManager"/>
<property name="sessionMode" value="native"/>
<!-- 多realm认证器 -->
<property name="authenticator" ref="authenticator"/>
</bean>
2.认证策略,多个realm怎么样才算认证通过能,这里可以通过认证策略才实现。
既然是认证策略,那就是多realm的才能使用,根据
Shiro认证流程1_调用自定义realm中流程图可以看到多realm调用ModularRealmAuthenticator下的doMultiRealmAuthentication()方法,认证策略就是在这个方法中获取到。
AuthenticationStrategy 接口的默认实现:
-
FirstSuccessfulStrategy:只要有一个 Realm 验证成功即可,只返回第一个 Realm 身份验证成功的认证信息,其他的忽略;
-
AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,和FirstSuccessfulStrategy 不同,将返回所有Realm身份验证成功的认证信息;
-
AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有Realm身份验证成功的认证信息,如果有一个失败就失败了。
ModularRealmAuthenticator 默认是 AtLeastOneSuccessfulStrategy策略
IOC容器中配置:
<!-- 多realm认证器 -->
<bean id="authenticator"
class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
<property name="realms">
<list>
<ref bean="jdbcRealm"/>
<ref bean="secondRealm"/>
</list>
</property>
<!-- 修改认证策略 -->
<property name="authenticationStrategy">
<bean class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"/>
</property>
</bean>
源码流程: