使用Spring Security检查额外参数

时间:2014-12-26 13:49:56

标签: java spring spring-security


请在Spring Security中提示,如何在用户登录时检查其他参数 例如,不仅要检查“用户名”和“密码”,还要检查他是否通过电子邮件链接注册;
所有数据都存储在DB中,我可以通过UserDetailsS​​ervice的实现轻松获取;
但是如何使安全服务注意附加参数“isValidated”? 我现在正在使用Spring 3.2.0;

1 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是创建自定义AuthenticationProvider或扩展现有自定义{{3}}。在您的情况下,扩展例如DaoAuthenticationProvider并放置逻辑以检查帐户是否在additionalAuthenticationChecks()方法中得到确认就足够了。

以下是一个例子:

public class CustomAuthenticationProvider extends DaoAuthenticationProvider {

    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
        // Perform the checks from the super class
        super.additionalAuthenticationChecks(userDetails, authentication);

        // Cast the UserDetails to the implementation you use
        User user = (User) userDetails;

        // Check the confirmed status
        if (!user.isAccountConfirmed()) {
            throw new AccountNotConfirmedException("Account is not confirmed yet.");
        }
    }

    public static class AccountNotConfirmedException extends AuthenticationException {
        public AccountNotConfirmedException(String message) {
            super(message);
        }
    }

}

UserDetails的实施应包含有关帐户确认状态的信息。您可以在UserDetailsService

的实施中映射此信息

选项2

编辑:现在我看一下,第一个解决方案有点过于复杂。您可以轻松解决此问题,而无需使用自定义AuthenticationProvider。如果帐户未得到确认,请确保isEnabled()实施的UserDetails返回false。如果enabled属性为false,则不允许进行身份验证(Spring Security会自动执行此操作)。

如果要显式处理AccountNotConfirmedException中的AuthenticationFailureHandler,第一个解决方案可能仍然有用。