2013-02-21 60 views
1

所以用戶登錄- >關閉瀏覽器- >打開瀏覽器再一次- >出現錯誤:春季安全重定向時,此主體最大會話數超過

HTTP Status 401 - Authentication Failed: Maximum sessions of 1 for this principal exceeded 

我需要的是捕捉到這一事件會話無效,刪除所有會話該用戶並重定向到正常的登錄頁面

春季安全配置:

 <http auto-config="true" use-expressions="true"> 
       <session-management session-fixation-protection="migrateSession"> 
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> 
       </session-management> 
       <intercept-url pattern="/login" access="hasRole('ROLE_ANONYMOUS')" requires-channel="any"/> 

    <!--<custom-filter after="CONCURRENT_SESSION_FILTER" ref="sessionExpiration" /> --> 
    <!-- .... --> 

     </http> 

<beans:bean id="sessionExpiration" class="com.test.security.SessionExpirationFilter"> 
    <beans:property name="expiredUrl"> 
      <beans:value>/login</beans:value> 
     </beans:property> 
</beans:bean> 

我試圖執行一些過濾器,但它總是顯示會話爲空:

public class SessionExpirationFilter implements Filter, InitializingBean { 
    private String expiredUrl; 

    public void destroy() { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 

     String path = httpRequest.getServletPath(); 
     HttpSession session = httpRequest.getSession(false); 

     System.out.println(session); 
     if (session == null && !httpRequest.isRequestedSessionIdValid()) {    
      SecurityContextHolder.getContext().setAuthentication(null); 
      String targetUrl = httpRequest.getContextPath() 
        + expiredUrl; 
      httpResponse.sendRedirect(httpResponse.encodeRedirectURL(targetUrl)); 
      return; 
     } 
     chain.doFilter(request, response); 
    } 

    public void setExpiredUrl(String expiredUrl) { 
     this.expiredUrl = expiredUrl; 
    } 
} 

回答

6

從我的理解,要前一交易日無效,如果用戶的會話超過「最大的會話」 。將屬性'error-if-maximum-exceeded'設置爲false。 Spring安全會自動使以前的會話失效。

如果你正在嘗試做不同的事情,

  1. 擴展ConcurrentSessionControlStrategy類,並覆蓋 'allowableSessionsExceeded' 的方法。
  2. 指定上述的bean引用爲 '會話管理'

的 '會話的認證策略-REF' 屬性值。

+0

我已經設置'錯誤如果利用最大exceeded'爲'FALSE'。當我嘗試多次登錄時,最新的會話將會使以前的會話失效。但是,*如果我必須保持第一次會話,並且不允許在第一次登出完成之前再次登錄,該怎麼辦?*您是否知道如何實現這一點? – OO7 2015-05-14 09:19:55

+0

@ OO7您需要將該屬性設置爲'true',那麼第二個會話將不被允許 'error-if-maximum-exceeded =「true」' – 2016-09-28 07:06:33

2

設置error-if-maximum-exceeded="false"將允許第二次會議和無效的第一個作爲你max-sessions="1"

如果你有max-sessions="2"那麼它將使Nth會議也並失去所有N-2會議

<session-management session-fixation-protection="migrateSession"> 
    <concurrency-control max-sessions="1" error-if-maximum-exceeded="false"/> 
</session-management> 

設置error-if-maximum-exceeded="true"NOT允許第二次會話並使第二次會話失效,因爲您的max-sessions="1"

如果您有max-sessions="2",那麼它將不允許2+會話和無效。

-1

<session-management session-authentication-strategy-ref="sas"/> 
 
<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy"> 
 
     <beans:property name="maximumSessions" value="1"/> 
 
     <beans:property name="exceptionIfMaximumExceeded" value="true"/> 
 
     <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"/> 
 
    </beans:bean> 
 
    <beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>

+1

歡迎使用Stack Overflow!雖然這可能會在理論上回答這個問題,[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 – 2017-04-04 15:52:09