java - 使用 Spring Security 检查额外参数

标签 java spring spring-security


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

最佳答案

实现此目的的一种方法是创建自定义 AuthenticationProvider或扩展现有的。在您的情况下,扩展例如 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实现应包含有关帐户确认状态的信息。您可以在 UserDetailsS​​ervice 的实现中映射此信息。

选项 2

编辑:现在我看看,第一个解决方案有点过于复杂。您无需使用自定义 AuthenticationProvider 即可轻松解决此问题。如果帐户未确认,只需确保 UserDetails 实现的 isEnabled() 返回 false 即可。如果 enabled 属性为 false 将不允许身份验证(这由 Spring Security 自动处理)。

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

关于java - 使用 Spring Security 检查额外参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27658030/

相关文章:

java - NoHandlerFoundException 集中的 'parameters map' 在哪里?

java - 基于字典的字符串匹配算法 - Java

java - Spring Batch - 如何使用从 REST API 请求收到的文件名启 Action 业

java - Spring Hibernate 查询中的日期

spring-security - 手动验证用户身份

java - 有什么方法可以保证ElasticSearch索引已被删除

java - 如何从文件中读取多个相同的对象

Spring OAuth2 - 创建访问 token

java - 在 Liferay 上部署 SpringMVC 项目。错误 : ERROR [com. liferay.portal.kernel.deploy.auto.AutoDeployScanner][AutoDeployDir:220]

java - 使用 Spring Security 3.2.x 进行两页登录