5

我已经实施了 spring security 来保护我们网站的某些部分。我正在使用数据库(MongoDB)来存储用户名/密码。我实现了 org.springframework.security.core.userdetails.UserDetailsS​​ervice 从数据库中查找帐户详细信息。

我还需要添加另一个功能:帐户激活。注册后,我们会向用户发送一封激活电子邮件,如果他点击它,我们会在数据库中将该帐户标记为已激活。尚未激活其帐户的用户不应被允许登录,并应被重定向到一个页面。

关于如何实施的任何想法?我需要以某种方式进入登录过程。

谢谢!

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 回答