私は春のセキュリティを使用するアプリケーションを持っています。サインアッププロセスでは、新しいユーザーエンティティが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());
}
を自動的にアプリケーションにユーザーをログインすると、この
を行うには、私のサーブレットでこのメソッドが含まれているしたいと思います。だから私が考えることができる唯一の他の選択肢は、非ハッシュパスワードをリクエストパラメータとしてサーブレットに渡すことです(厄介です)。私は何かが恋しくなったのですか?ユーザーを事前認証する別の方法はありますか?
おかげ
を私はここに愚かであること、ユーザーがアクティベーションリンクをクリックしたたと我々は見ています彼には正当なユーザーがいることが明らかになっているので、 authenticationManagerで彼を再認証する必要があり、トークンを作成するときに資格情報を使用する必要はありません。次のように作成してください:PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken( p、null、p.getAuthorities()); –
別の類似の質問(および回答)はここで見つけることができます:http://stackoverflow.com/a/12057327/26510 –
@ClintonBoschあなたは答えとしてコメントを書いてそれを受け入れることができます – fglez