5

私たちのウェブサイトのセクションを保護するために春のセキュリティを実装しました。ユーザー名/パスワードを保存するために DB (MongoDB) を使用しています。org.springframework.security.core.userdetails.UserDetailsS​​ervice を実装して、DB からアカウントの詳細を検索します。

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

実装方法に関するアイデアはありますか? どういうわけかログインプロセスにフックする必要があります。

ありがとう!

4

2 に答える 2

10

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

更新しました

Spring エラー メッセージを表示するには、ログイン ページでこれを使用する必要があります。

<c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />
于 2012-06-25T13:09:30.197 に答える
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}

適切なメッセージをユーザーに表示します }

于 2012-06-25T10:29:53.967 に答える