多重认证是操作的是多个Realm。第一种方式是,在ModularRealmAuthenticator里面可以配置多个Reamls,默认的验证策略是,至少一个满足即可(AtLeastOneSuccessfulStrategy)。建议将多Realm配置在DefaultWebSecurityManager ,将验证策略和Reaml分开来管理,也就是下面,多重认证的第二种方式。
一、多重认证
多重认证,主要的类是ModularRealmAuthenticator,他有两个需要配置的属性,一个是Collection(用于存储Realm),另一个是AuthenticationStrategy(用于存储验证的策略 )。
第一种:配置在ModularRealmAuthenticator
下面代码,配置了两个Reamls,第一个使用的是MD5码表,第二个是 SHA1的加密,验证的策略是两个都必须满足才可以让你登录。
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 缓存管理器 -->
<property name="cacheManager" ref="cacheManager" />
<!-- 验证 -->
<property name="authenticator" ref="authenticator"/>
</bean>
<!-- 配置多个 realm -->
<bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
<property name="authenticationStrategy" >
<bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"/>
</property>
<!-- 多个验证策略 realmes -->
<property name="realms">
<list>
<!-- 这个认证,有一个先后的顺序 -->
<ref bean="sampleRealm1"/>
<ref bean="sampleRealm2"/>
</list>
</property>
</bean>
<!-- 授权 认证 ,自己定义的,领域(Realm),shiro需要配置一个领域(Realm),以便我们可以访问用户-->
<bean id="sampleRealm1" class=" com.yellowcong.shior.realm.SampleRealm" >
<!-- 如果不加入密码匹配的操作,密码就不会存在 -->
<!-- 加入了密码匹配器之后,就会默认将前台传递过来的密码自动MD5加密 -->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!-- 加密的方式 -->
<constructor-arg index="0" type="java.lang.String" value="MD5" />
<!-- 加密的次数,默认是1次 -->
<property name="hashIterations" value="1024"/>
</bean>
</property>
</bean>
第二种:配置在DefaultWebSecurityManager(推荐)
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 缓存管理器 -->
<property name="cacheManager" ref="cacheManager" />
<!-- 验证 -->
<property name="authenticator" ref="authenticator"/>
<!-- 多个验证策略 realmes -->
<property name="realms">
<list>
<!-- 这个认证,有一个先后的顺序 -->
<ref bean="sampleRealm1"/>
<ref bean="sampleRealm2"/>
</list>
</property>
</bean>
<!-- 授权策略 -->
<bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
<property name="authenticationStrategy" >
<bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"/>
</property>
</bean>
<!-- 授权 认证 ,自己定义的,领域(Realm),shiro需要配置一个领域(Realm),以便我们可以访问用户-->
<bean id="sampleRealm1" class=" com.yellowcong.shior.realm.SampleRealm" >
<!-- 如果不加入密码匹配的操作,密码就不会存在 -->
<!-- 加入了密码匹配器之后,就会默认将前台传递过来的密码自动MD5加密 -->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!-- 加密的方式 -->
<constructor-arg index="0" type="java.lang.String" value="MD5" />
<!-- 加密的次数,默认是1次 -->
<property name="hashIterations" value="1024"/>
</bean>
</property>
</bean>
<!-- 授权 认证 ,自己定义的,领域(Realm),shiro需要配置一个领域(Realm),以便我们可以访问用户-->
<bean id="sampleRealm2" class=" com.yellowcong.shior.realm.SampleRealm2" >
<!-- 如果不加入密码匹配的操作,密码就不会存在 -->
<!-- 加入了密码匹配器之后,就会默认将前台传递过来的密码自动SHA1加密 -->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!-- 加密的方式 -->
<constructor-arg index="0" type="java.lang.String" value="SHA1" />
<!-- 加密的次数,默认是1次 -->
<property name="hashIterations" value="1024"/>
</bean>
</property>
</bean>
二、认证策略
策略 | 意义 |
---|---|
AllSuccessfulStrategy | 所有都满足的情况 |
AtLeastOneSuccessfulStrategy(默认) | 至少一条满足的情况 |
FirstSuccessfulStrategy | 第一条满足的情况 |