Spring Security 根据权限跳转不同画面(使用authentication-success-handler-ref流向不同action)

最近项目开发中有这样一个业务逻辑,一个登陆画面,根据不同权限跳转到不同的画面(Action) 
开始的做法是直接跳到一个调度的Action,再由这个Action去分配。 
这次开发使用了安全框架,遂希望通过安全框架去做这个调度 
于是使用authentication-success-handler-ref 
来替换default-target-url和always-use-default-target,实现这一目的
 

国际惯例,先上代码 
Xml代码   收藏代码
  1. <http auto-config='true'  >  
  2.   <intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>  
  3.   <intercept-url pattern="/user/**" access="ROLE_SPACE_ADMIN,ROLE_SMALL_SPACE_ADMIN,ROLE_INSTITUTION_MEMBER,ROLE_SYSTEM_ADMIN"/>    
  4.   <intercept-url pattern="/admin/**" access="ROLE_SUPER_ADMIN"/>    
  5.   <form-login login-page="/user/login.action"   
  6.             authentication-failure-url="/user/login.action?msg=fault"   
  7.             authentication-success-handler-ref="authenticationDispatcher"  
  8.             login-processing-url="/securityLogin"/>  
  9.   <logout logout-success-url="/user/login.action" logout-url="/securityLogout"/>  
  10. </http>  
  11. <beans:bean id="authenticationDispatcher" class="com.lstp.service.security.impl.LstpAuthenticationSuccessHandler">  
  12.   <beans:property name="authDispatcherMap">  
  13.     <beans:ref local="dispatcherMap"/>  
  14.   </beans:property>  
  15. </beans:bean>  
  16. <beans:bean id="dispatcherMap" class="java.util.HashMap">  
  17.   <beans:constructor-arg>  
  18.     <beans:map>  
  19.       <beans:entry key="ROLE_SPACE_ADMIN" value="/user/userSpace.action"/>  
  20.       <beans:entry key="ROLE_SMALL_SPACE_ADMIN" value="/user/userSpace.action"/>  
  21.       <beans:entry key="ROLE_INSTITUTION_MEMBER" value="/user/userSpace.action"/>  
  22.       <beans:entry key="ROLE_SYSTEM_ADMIN" value="/admin/adminSpace.action"/>  
  23.       <beans:entry key="ROLE_SUPER_ADMIN" value="/admin/adminSpace.action"/>  
  24.       </beans:map>  
  25.   </beans:constructor-arg>  
  26. </beans:bean>  

authentication-success-handler-ref="authenticationDispatcher"是至关重要的,当登陆成功会调用实现AuthenticationSuccessHandler接口的onAuthenticationSuccess方法. 
下面是实现类 
Java代码   收藏代码
  1. package com.lstp.service.security.impl;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Collection;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. import org.springframework.security.core.Authentication;  
  11. import org.springframework.security.core.GrantedAuthority;  
  12. import org.springframework.security.core.authority.GrantedAuthorityImpl;  
  13. import org.springframework.security.web.authentication.AuthenticationSuccessHandler;  
  14. import org.springframework.util.Assert;  
  15.   
  16. /** 
  17.  * 权限登录成功句柄 
  18.  * 该类为平台成功跳转到多个入口提供依据 
  19.  * @author ryuu-kk 
  20.  * 
  21.  */  
  22. public class LstpAuthenticationSuccessHandler implements AuthenticationSuccessHandler {  
  23.   
  24.     /** 
  25.      * url参数 
  26.      */  
  27.     private Map<String, String> map;  
  28.     /** 
  29.      * 多role选择,默认取得权限表第一个权限 
  30.      */  
  31.     private boolean isFirst = true;  
  32.     @Override  
  33.     public void onAuthenticationSuccess(HttpServletRequest request,  
  34.             HttpServletResponse response, Authentication authentication)  
  35.             throws IOException, ServletException {  
  36.         Assert.notNull(map, "AuthInterceptMap is null!");  
  37.         String url = "";  
  38.         Collection<GrantedAuthority> authCollection = authentication.getAuthorities();  
  39.   
  40.         if (authCollection.isEmpty()) {  
  41.             return;  
  42.         }  
  43.         //对于一个登录用户有多种角色,只取得第一个  
  44.         if (isFirst) {  
  45.             GrantedAuthority[] a = new GrantedAuthorityImpl[]{};  
  46.             url = map.get(authCollection.toArray(a)[0].toString());  
  47.             response.sendRedirect(request.getContextPath() + url);  
  48.             return;  
  49.         }  
  50.         //选择取得最后一个role掉转;这里一个用户的多个角色较少  
  51.         //迭代的速度比转换成数组的速度要快  
  52.         for (GrantedAuthority auth : authCollection) {  
  53.             url = map.get(auth.getAuthority());  
  54.         }  
  55.         response.sendRedirect(url);  
  56.     }  
  57.       
  58.     /** 
  59.      * 权限跳转依据 
  60.      * @param map 参数 
  61.      *  key:url 
  62.      *  value:role 
  63.      */  
  64.     public void setAuthDispatcherMap(Map<String, String> map) {  
  65.         this.map = map;  
  66.     }  
  67.   
  68.     /** 
  69.      * 多种角色方案 
  70.      * 设置是否只取得第一个role 
  71.      * @param isFirst true:多种角色只取第一个,false:取得最后一个 
  72.      */  
  73.     public void setMultipleAuth(boolean isFirst) {  
  74.         this.isFirst = isFirst;  
  75.     }  
  76. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值