2011-07-05 17 views
5

私は春のセキュリティを使用するアプリケーションを持っています。サインアッププロセスでは、新しいユーザーエンティティがHASHEDパスワードで永続化され、アクティベーショントークンを含む電子メールがユーザーに送信されます。このトークンをクリックすると、ユーザーはトークンによってユーザーを検索し、ユーザーをアクティブにしてアプリケーションにリダイレクトするUserActivationServletに誘導されます。私はここでの問題は、それが作成されたときにユーザエンティティのパスワードフィールドはハッシュ化されたことということです春のセキュリティによる自動ログイン

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()); 
} 

を自動的にアプリケーションにユーザーをログインすると、この

を行うには、私のサーブレットでこのメソッドが含まれているしたいと思います。だから私が考えることができる唯一の他の選択肢は、非ハッシュパスワードをリクエストパラメータとしてサーブレットに渡すことです(厄介です)。

私は何かが恋しくなったのですか?ユーザーを事前認証する別の方法はありますか?

おかげ

+1

を私はここに愚かであること、ユーザーがアクティベーションリンクをクリックしたたと我々は見ています彼には正当なユーザーがいることが明らかになっているので、 authenticationManagerで彼を再認証する必要があり、トークンを作成するときに資格情報を使用する必要はありません。次のように作成してください:PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken( p、null、p.getAuthorities()); –

+0

別の類似の質問(および回答)はここで見つけることができます:http://stackoverflow.com/a/12057327/26510 –

+1

@ClintonBoschあなたは答えとしてコメントを書いてそれを受け入れることができます – fglez

答えて

3

ユーザーがアクティベーションリンクをクリックしたと我々は我々が有効なユーザーを持っているので、明らかに彼を見上げているので、必要はありません次のようにauthenticationManagerので、トークンを作成するときに資格情報を使用する必要はありませんとの再認証彼に、ちょうどそれを作成します。

PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(p, null, p.getAuthorities()); 
0

私が正しくあなたを理解していればSOAはあなたを助けることができます。

ログインページにリダイレクトする必要はなく、ユーザをログインさせるサービスを呼び出すことができます。コントローラ(またはサービスレイヤの上のどこか)にあるログイン関連ロジックは、あなたのサーブレットで使用されます。そして、あなたは、サーブレットからloginService.login(username);を呼び出すことができます

public interface LoginService { 
    // this will be called from the login page 
    public void login(String username, String hashedPass); 

    // this will only be visible to other services 
    // you can secure it with AOP and Spring security's method security 
    public void login(String username); 
} 

サービスは次のようなものを見ることができます。

それともあなたの正確な場合、パスワードなしでトークンを渡す:

loginService.login(new UsernamePasswordAuthenticationToken(u.getUsername(), "")); 
+0

なぜ否定的なスコア? – Simeon

関連する問題