apache-shiro杂记(二) 关于多realm认证的策略
2015-05-24 16:15
337 查看
一直以为给定的下面配置是短路方式的,即defaultJdbcRealm可以成功认证,backDoorJdbcRealm就不会被调用。
其实不然,org.apache.shiro.authc.pam.FirstSuccessfulStrategy并不是这个意思,所有的realm依然都会被调用。
只不过是第一个认证成功的AuthenticationInfo作为最后的结果返回。
其实不然,org.apache.shiro.authc.pam.FirstSuccessfulStrategy并不是这个意思,所有的realm依然都会被调用。
只不过是第一个认证成功的AuthenticationInfo作为最后的结果返回。
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 其他配置 --> <property name="authenticator" ref="authenticator" /> <property name="realms"> <list> <ref bean="defaultJdbcRealm" /> <ref bean="backDoorJdbcRealm" /> </list> </property> </bean> <bean id="defaultJdbcRealm" class="..." /> <bean id="backDoorJdbcRealm" class="..." /> <bean id="authenticator" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator"> <property name="authenticationStrategy"> <bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" /> </property> </bean>为了实现目的,必须对org.apache.shiro.authc.pam.ModularRealmAuthenticator改造。
package xxx.yyy.security; import java.util.Collection; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.pam.AuthenticationStrategy; import org.apache.shiro.realm.Realm; import org.apache.shiro.util.CollectionUtils; public class ModularRealmAuthenticator extends org.apache.shiro.authc.pam.ModularRealmAuthenticator { @Override protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token) { AuthenticationStrategy strategy = getAuthenticationStrategy(); AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token); for (Realm realm : realms) { aggregate = strategy.beforeAttempt(realm, token, aggregate); if (realm.supports(token)) { AuthenticationInfo info = null; Throwable t = null; try { info = realm.getAuthenticationInfo(token); } catch (Throwable throwable) { t = throwable; } aggregate = strategy.afterAttempt(realm, token, info, aggregate, t); // dirty dirty hack if (aggregate != null && !CollectionUtils.isEmpty(aggregate.getPrincipals())) { return aggregate; } // end dirty dirty hack } else { } } aggregate = strategy.afterAllAttempts(token, aggregate); return aggregate; } }
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 其他配置 --> <property name="authenticator" ref="authenticator" /> <property name="realms"> <list> <ref bean="defaultJdbcRealm" /> <ref bean="backDoorJdbcRealm" /> </list> </property> </bean> <bean id="defaultJdbcRealm" class="..." /> <bean id="backDoorJdbcRealm" class="..." /> <bean id="authenticator" class="xxx.yyy.security.ModularRealmAuthenticator"> <property name="authenticationStrategy"> <bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" /> </property> </bean>
相关文章推荐
- apache-shiro杂记(二) 关于多realm认证的策略
- Shiro之多Realm的认证及认证策略-yellowcong
- Apache Shiro 使用手册(四)Realm 实现
- java鬼混笔记:shiro 2、自定义realm进行认证
- Shiro 的身份认证-Realm
- Apache Shiro 使用手册(二)Shiro 认证
- Apache Shiro(四)Realm 实现
- Apache Shiro 使用手册(四)Realm 实现
- Apache Shiro 使用手册(四)Realm 实现
- Apache Shiro 认证、授权、加密和会话管理
- 使用Apache Shiro进行身份认证-LDAP两次绑定认证
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
- [杂记] 关于 Perl 与 Apache
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- (二)Apache Shiro 身份验证之Realm
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- Apache Shiro 使用手册(四)Realm 实现
- shiro-realm查询认证信息在页面展示
- 当shiro不进入自定义realm的权限认证方法时
- 使用Apache Shiro进行身份认证-LDAP认证