2011-07-06 40 views

回答

4

,最可靠的辦法是自定義Spring Security filter chain當成功登錄時保存時間戳在用戶的會話。然後你可以像訪問任何會話屬性一樣訪問它。

1

根據文檔,您可以將add your own filters添加到Spring Security過濾器鏈中。
如果您使用http/form-loginBasicAuthenticationFilter,在http/http-basic的情況下,您可以在UsernamePasswordAuthenticationFilter之後添加過濾器,因此我們保證該會話已被創建。
要涵蓋兩者,您可以在最後一個之後添加過濾器,並將信息添加到會話中。

聲明你的過濾豆:

<bean id="myFilter" class="com.MyFilter"/> 

它加入連鎖,BasicAuthenticationFilter之後:

<http> 
    <custom-filter ref="myFilter" after="BASIC_AUTH_FILTER"/> 
    ... 

doFilter方法應該是這樣:

private static final String LOGGED_TIME_KEY = "LOGGED_TIME"; 

@Override 
public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    if (authentication != null && authentication.isAuthenticated()) { 
     HttpSession session = request.getSession(false); 
     if (session != null && session.getAttribute(LOGGED_TIME_KEY) == null) { 
      session.setAttribute(LOGGED_TIME_KEY, new Date()); 
     } 
    } 
    chain.doFilter(req, res); 
} 

請記住,您可以使用其他掛鉤。您可以將其添加到您的AuthenticationProvider

編輯:

還有一個更簡單的方法來做到這一點,如果你正在使用form-login
您可以使用自定義AuthenticationSuccessHandler。要定義它,請更新您的form-login標記,並添加屬性authentication-success-handler-ref