我有一個使用彈簧安全的應用程序。在我的註冊過程中,一個新的用戶實體會持續使用HASHED密碼,包含激活令牌的電子郵件將發送給用戶。單擊此令牌可將用戶導向UserActivationServlet,該令牌通過令牌查找用戶,激活用戶並將其重定向到應用程序。我想自動將用戶登錄到應用程序,並已列入我的servlet這種方法,在這裏做這個彈簧安全自動登錄
private void authenticateUserAndSetSession(HttpServletRequest request, User u) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
u.getUsername(), u.getPassword()); //PROBLEM: THIS PASSWORD IS HASHED
// generate session if one doesn't exist
request.getSession();
token.setDetails(new WebAuthenticationDetails(request));
Authentication authenticatedUser = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
SecurityContextHolder.getContext());
}
的問題是,它是否被創建時的用戶實體密碼字段已散列。所以我能想到的唯一的另一個選擇是將不需要的密碼作爲請求參數傳遞給servelet(討厭!)
我錯過了什麼,有沒有另一種預先驗證用戶的方式?
感謝
我被這裏愚笨,用戶點擊激活鏈接,我們已經看了他很清楚我們有一個有效的用戶,所以沒有需要使用authenticationManager重新對其進行身份驗證,因此在創建令牌時不需要使用憑據,只需按如下所示創建它即可:PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken( p,null,p.getAuthorities()); –
另一個類似的問題(和答案)可以在這裏找到:http://stackoverflow.com/a/12057327/26510 –
@ClintonBosch你可以寫評論作爲答案並接受它 – fglez