2012-06-25 1 views
5

私は弊社ウェブサイトのセクションを保護するために春のセキュリティを実装しています。私はユーザー名/パスワードを格納するためにDB(MongoDB)を使用しています。 DBからアカウントの詳細を検索するためにorg.springframework.security.core.userdetails.UserDetailsS​​erviceを実装しました。春のセキュリティログインする前に自分のアカウントをアクティブにする必要があります

アカウントの有効化という別の機能を追加する必要があります。登録後、ユーザーにアクティベーションEメールを送信し、ユーザーがクリックすると、そのアカウントをDBで有効にしてマークします。アカウントを有効にしていないユーザーはログインを許可されるべきではなく、そのページのページにリダイレクトする必要があります。

実装方法に関するアイデアはありますか?私は何とかログインプロセスにフックする必要があります。

ありがとうございます!

答えて

9

カスタムAuthenticationManager必要ない。。この機能はすでにSpring Securityで利用可能です。 docを見ると、enabledプロパティが表示されます。ユーザーを作成するときに、そのプロパティーをfalseに設定してユーザーがログインしようとすると、Springはユーザーにアカウントがアクティブではないことを知らせるメッセージを自動的に表示します。

は春のエラーメッセージを表示するためには

を更新し、ログインページでこれを使用する必要があります。答えを

<c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" /> 
+0

嬉しいです

+0

ありがとう!素晴らしい答え! JSPで、アカウントが有効でないためにユーザーが認証されなかったことをどのように知ることができますか? – checklist

+0

答えを更新しました。 – jddsantaella

2

あなたは

<bean id="authenticationFilter"  class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" 
     p:authenticationManager-ref="customAuthenticationManager" 
     p:authenticationFailureHandler-ref="customAuthenticationFailureHandler" 
     p:authenticationSuccessHandler-ref="customAuthenticationSuccessHandler" /> 

、カスタム、カスタム認証ユーザーがアクティブになるかどうかをチェックすることができますマネージャか

を作成することができますauthenticationManager

<bean id="customAuthenticationManager" 
     class="com.mycompany.security.CustomAuthenticationManager" /> 

CustomAuthenticationManager.java

public class CustomAuthenticationManager implements import org.springframework.security.authentication.AuthenticationManager{ 
     @Override 
    public Authentication authenticate(Authentication auth) 
      throws AuthenticationException { 

     User user = null; 
     if (auth.getName() == null) { 
      throw new BadCredentialsException("User does not exists!"); 
     } 
     user = userService.getUserByUsername(auth.getName()); 
     if (user == null) { 
      throw new BadCredentialsException("User does not exists!"); 
     } 
     if (passwordEncoder.isPasswordValid(user.getPassword(), (String) auth.getCredentials(), null)) { 
      //check if user is activated if not throw appropriate excetion 
     } else { 
      throw new BadCredentialsException("User does not exists!"); 
     } 

    } 

それと(適切に設定されている場合)にlogin.jspで今ログインページに戻って

をユーザーをリダイレクトする、

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 

によって失敗の理由を取得し、ユーザー }に適切なメッセージを表示

+0

感謝を。しかし、どうすれば別のページにリダイレクトできますか? – checklist

+0

詳細を追加 –

+2

カスタム認証マネージャは必要ありません。 UserDetailsの "enable"プロパティを使用する必要があります。 – jddsantaella

関連する問題