shiro 多realm

来源:互联网 发布:js bind call apply 编辑:程序博客网 时间:2024/05/17 11:05

首先自定义一个DefaultUsernamepasswordToken.java,继承Shiro自带的UsernamePasswordToken,在DefaultUsernamepasswordToken中新加一个属性 

private String loginType;  而后生成getter setter;

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class DefaultUsernamepasswordToken extends UsernamePasswordToken {  
  2.   
  3.     /** 
  4.      * 判断登录类型 
  5.      */  
  6.     private String loginType;  
  7.   
  8.     public String getLoginType() {  
  9.         return this.loginType;  
  10.     }  
  11.   
  12.     public void setLoginType(String loginType) {  
  13.         this.loginType = loginType;  
  14.     }  
  15.   
  16.     /** 
  17.      * Shiro 构造方法 
  18.      *  
  19.      * @author : tanzhen 
  20.      * @date :2016年7月28日 
  21.      */  
  22.     public DefaultUsernamepasswordToken(String username, String password) {  
  23.         super(username, password);  
  24.     }  
  25.   
  26.     public DefaultUsernamepasswordToken() {  
  27.   
  28.     }  
  29. }  


然后自定义一个DefautModularRealm.java,继承 ModularRealmAuthenticator,重写doMultiRealmAuthentication、doSingleRealmAuthentication、doAuthenticate、assertRealmsConfigured四个方法,还需要定义一个变量,

用来接收传进来的多个Realm。

      

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class DefaultModularRealm extends ModularRealmAuthenticator {  
  2.     private Map<String, Object> definedRealms;  
  3.   
  4.     /** 
  5.      * 多个realm实现 
  6.      */  
  7.     @Override  
  8.     protected AuthenticationInfo doMultiRealmAuthentication(  
  9.             Collection<Realm> realms, AuthenticationToken token) {  
  10.         return super.doMultiRealmAuthentication(realms, token);  
  11.     }  
  12.   
  13.     /** 
  14.      * 调用单个realm执行操作 
  15.      */  
  16.     @Override  
  17.     protected AuthenticationInfo doSingleRealmAuthentication(Realm realm,  
  18.             AuthenticationToken token) {  
  19.   
  20.         // 如果该realms不支持(不能验证)当前token  
  21.         if (!realm.supports(token)) {  
  22.             throw new ShiroException("token错误!");  
  23.         }  
  24.         AuthenticationInfo info = null;  
  25.         try {  
  26.             info = realm.getAuthenticationInfo(token);  
  27.   
  28.             if (info == null) {  
  29.                 throw new ShiroException("token不存在!");  
  30.             }  
  31.         } catch (Exception e) {  
  32.             throw new ShiroException("用户名或者密码错误!");  
  33.         }  
  34.         return info;  
  35.     }  
  36.   
  37.     /** 
  38.      * 判断登录类型执行操作 
  39.      */  
  40.     @Override  
  41.     protected AuthenticationInfo doAuthenticate(  
  42.             AuthenticationToken authenticationToken)  
  43.             throws AuthenticationException {  
  44.         this.assertRealmsConfigured();  
  45.   
  46.         Realm realm = null;  
  47.   
  48.         DefaultUsernamepasswordToken token = (DefaultUsernamepasswordToken) authenticationToken;  
  49.         if (token.getLoginType().equals("huimai")) {  
  50.             realm = (Realm) this.definedRealms.get("defaultJdbcRealm");  
  51.         }  
  52.         if (token.getLoginType().equals("shiro")) {  
  53.             realm = (Realm) this.definedRealms.get("shiroDbRealm");  
  54.         }  
  55.         if (realm == null) {  
  56.             return null;  
  57.         }  
  58.   
  59.         return this.doSingleRealmAuthentication(realm, authenticationToken);  
  60.     }  
  61.   
  62.     /** 
  63.      * 判断realm是否为空 
  64.      */  
  65.     @Override  
  66.     protected void assertRealmsConfigured() throws IllegalStateException {  
  67.         this.definedRealms = this.getDefinedRealms();  
  68.         if (CollectionUtils.isEmpty(this.definedRealms)) {  
  69.             throw new ShiroException("值传递错误!");  
  70.         }  
  71.     }  
  72.   
  73.     public Map<String, Object> getDefinedRealms() {  
  74.         return this.definedRealms;  
  75.     }  
  76.   
  77.     public void setDefinedRealms(Map<String, Object> definedRealms) {  
  78.         this.definedRealms = definedRealms;  
  79.     }  
  80. }  


   这里需要注意是 其实 流程是:在给DefaultUsernamepasswordToken赋值时,将loginType设置成相应的参数,然后在doAuthenticate时判断,单个调用对应的Realm。然后是xml文件配置:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">    
  2.         <!-- 其他配置 -->    
  3.       <property name="authenticator" ref="defineModularRealmAuthenticator" />  
  4.       <property name="realms">    
  5.             <list>    
  6.                 <ref bean="defaultJdbcRealm" />    
  7.                 <ref bean="shiroDbRealm" />    
  8.             </list>    
  9.         </property>  
  10.     </bean>    
  11.   
  12.     <!--  -->  
  13.     <bean id="defineModularRealmAuthenticator"    
  14.         class="com.zynsun.platform.realm.DefaultModularRealm">    
  15.         <property name="definedRealms">    
  16.             <map>    
  17.                 <entry key="defaultJdbcRealm" value-ref="defaultJdbcRealm" />    
  18.                 <entry key="shiroDbRealm" value-ref="shiroDbRealm" />    
  19.             </map>    
  20.         </property>    
  21.         <!-- <property name="authenticationStrategy">    
  22.             <bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" />    
  23.         </property> -->  
  24.     </bean>   
  25.     <!--  -->  
  26.   
  27.     <bean id="defaultJdbcRealm" class="com.xxxx.shiro.DefaultRealm">  
  28.     </bean>    
  29.   
  30.     <bean id="shiroDbRealm" class="com.xxx.shiro.ShiroRealm">  
  31.            <property name="credentialsMatcher" ref="credentialsMatcher"></property>  
  32.     </bean>  


利用SecurityManager来进行配置。这样就完成了多个Realm认证,其实这种也只能算是单个Realm,毕竟是多个分割成单个去校验,还请大家多多指教。

0 0
原创粉丝点击