2011-02-17 103 views
5

我需要根據他的角色將用戶重定向到2個不同的註銷URL。我如何去做這件事?以編程方式更改彈簧安全註銷成功-URL

我使用春季安全2.0和我的XML看起來是這樣的:

<s:http access-denied-page="/" > 
     <s:intercept-url pattern="/pages/SplashPage.jsf" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
     <s:intercept-url pattern="/pages/Home.jsf" access="ROLE_USER,ROLE_MERCHANT"/> 

     <s:anonymous/> 
     <s:form-login 
      login-page="/" 
      login-processing-url="/j_spring_security_check" 
      default-target-url="/pages/Home.jsf" 
      authentication-failure-url="/" always-use-default-target='false' /> 
     <s:logout invalidate-session="true" logout-url="/pages/logout.jsf" logout-success-url="/" /> 
     <s:concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="false"/> 
    </s:http> 

回答

2

我無法找到這樣做的任何權利的方式,所以我結束了一個黑客:

  1. invalidate-session
  2. 改變logout-success-url特殊重定向控制器
  3. 在控制器,拉用戶會話來告訴用戶類型
  4. 無效會話
  5. 重定向到正確的URL的用戶類型
0

編輯 - 更新爲春季安全2.0解決方案。

與子類替換LogoutFilter的覆蓋doFilterHttp:

public void doFilterHttp(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, 
     ServletException { 

    if (requiresLogout(request, response)) { 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

     if (logger.isDebugEnabled()) { 
      logger.debug("Logging out user '" + auth + "' and redirecting to logout page"); 
     } 

     for (int i = 0; i < handlers.length; i++) { 
      handlers[i].logout(request, response, auth); 
     } 

     // Do role-specific logic here to determine targetUrl 

     sendRedirect(request, response, targetUrl); 

     return; 
    } 

    chain.doFilter(request, response); 
} 

更換LogoutFilter如下:

<beans:bean id="myLogoutFilter" class="com.mycompany.MyLogoutFilter"> 
    <custom-filter position="LOGOUT_FILTER"/> 
</beans:bean> 
+0

黯然`成功 - handler-ref`屬性被添加到更新爲spring security 2.0解決方案的3.0 – mkoryak 2011-02-18 22:40:52