2011-11-30 442 views
3

我有一個客戶類,其中包含所有帳戶信息(它不擴展Spring的userdetails.User類) 我試圖在成功登錄後執行一些操作(例如設置新的最後登錄時間)。爲了達到這個目的,我設置了一個自定義AuthenticationSuccessHandlerSpring Security - 身份驗證用戶名在AuthenticationSuccessHandler中爲空

onAuthenticationSuccess方法中,我嘗試從Authentication對象獲取用戶名。但是,此對象是User對象。如果我嘗試從它得到username,我會得到空。 我能以某種方式設法使Authority對象成爲Customer對象嗎?或者,我的客戶類是否必須擴展用戶類?

更新

更多的細節:

我有我的User類。它是完全自行編寫的,不實現或擴展任何接口/類。我沒有實現UserDetailsS​​ervice的類。我applicationContext-security.xml<form-login>部分看起來是這樣的:

<form-login login-page="/index.htm" 
       authentication-success-handler-ref='authSuccHandler' 
       authentication-failure-handler-ref='authFailureHandler' 
       default-target-url='/library/login.htm' 
       always-use-default-target='true'/> 

Theh authSuccHandler看起來是這樣的:(必要的bean定義到位)

public class PostSuccessfulAuthenticationHandler extends SimpleUrlAuthenticationSuccessHandler 
{ 
@Autowired 
private UserService userService; 

@Override 
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
     Authentication authentication) throws ServletException, IOException 
     { 
      userService.trackUserLogin(authentication.getName()); //NullPointerException 
      super.onAuthenticationSuccess(request, response, authentication); 
     } 
} 

形式重定向到j_spring_security_check

+0

能否請你加上你做什麼具體配置,是非標準(例如UserDetailsS​​ervice中,自定義過濾器,認證提供商等)的更多細節。要弄清楚你已經定製了什麼,以及你如何覆蓋默認的Spring Security實現類,這有點難。另外,請讓我們知道您使用的是什麼版本。 –

+0

增加了一些細節。 – tschaei

回答

0

我認爲您正在尋找的方法是getPrincipal on Authentication。然後,您必須對返回到您的自定義類的對象進行處理。

User user = (User)authentication.getPrincipal(); 
1

Authentication不能爲User,因爲它們不會相互繼承。

如果您的UserDetailsService產生自定義UserDetails,您應該能夠通過撥打Authentication調用getDetails()來獲得它。

+0

我仍然無法使它工作。認證的getDetails()我的Customer類實現UserDetails,但我還是得到一個ClassCastException。如果我使用Authentication的getPrincipal(),則返回的對象的類型爲User,用戶名爲null。我在這裏錯過了什麼? – tschaei

1

當請求進入驗證成功處理程序,它希望用戶能夠重定向到所需URL。使用以下命令重定向到所需頁面,如home.htm。 這將工作肯定! 修改後的代碼如下。檢查它並讓我知道你是否有任何問題。

public class PostSuccessfulAuthenticationHandler extends SimpleUrlAuthenticationSuccessHandler 
    { 
     @Autowired 
     private UserService userService; 

     @Override 
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
    Authentication authentication) throws ServletException, IOException 
    { 
     userService.trackUserLogin(authentication.getName()); //NullPointerException 
     response.sendRedirect("home.htm"); 
     //super.onAuthenticationSuccess(request, response, authentication); 
    } 
} 
相關問題