2012-07-05 151 views
5

我想記錄我的Web應用程序中的每個登錄信息。我能夠訪問通過UsernamePasswordAuthenticationFilter發生的登錄,但我不知道如何登錄使用記住我功能登錄的用戶。我試圖重寫使用Spring Security錄製登錄

createSuccessfulAuthentication(HttpServletRequest request, UserDetails user) 
TokenBasedRememberMeServices

,但隨後註銷記錄太多,因爲記得我服務的重新認證用戶。

回答

5

爲了記錄每個成功的登錄,我認爲最好的方法是創建LoginSucessHandler併爲正常登錄指定身份驗證成功處理程序以及記住我。我用下面的代碼和配置完成了這個。

@Service 
public class LoginSucessHandler extends 
     SavedRequestAwareAuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
      throws ServletException, IOException { 
     User user = (User) authentication.getPrincipal(); 
      // record login success of user 
     super.onAuthenticationSuccess(request, response, authentication); 
    } 

} 

<http auto-config="true" use-expressions="true"> 
    <form-login login-page="/login" 
     authentication-failure-url="/login.hst?error=true" 
     **authentication-success-handler-ref="loginSucessHandler"** /> 
    <logout invalidate-session="true" logout-success-url="/home" 
     logout-url="/logout" /> 
    <remember-me key="jbcp" **authentication-success-handler-ref="loginSucessHandler"**/> 
    <session-management> 
    <concurrency-control max-sessions="1" /> 
</session-management> 
</http> 
0

我認爲你的情況將有助於解決方案,當你將使用你的自定義過濾器,它會攔截你的應用程序的每個請求。在此過濾器中,您可以爲每個請求記錄用戶名。

Here I described how to add your custom filter。您只需要將功能更改爲您想要的功能即可。並且不要forhet在web.xml中的安全過濾器鏈之後放置過濾器。

4

記錄認證成功和失敗的最佳方式是使用Spring ApplicationListener

Spring Security發佈了各種可以偵聽的身份驗證成功和失敗事件。當訪問被拒絕給資源時,也會發布事件。

您可以查看LoggerListener爲例。首先將其中的一個添加到應用程序上下文中,並自動將警報級別的認證事件記錄下來。

關於記住我登錄,如果您註銷然後立即訪問網站,並使用記憶我cookie進行重新身份驗證,那麼從技術上講,它與任何其他記住我身份驗證相同,所以沒有你可以做很多事情。

但是,如果您的註銷成功URL正在通過記事本過濾器,並且正在創建新會話(沒有來自用戶的任何其他操作),則只需從安全性過濾器中忽略該頁面鏈。