Spring Security 预认证账户锁定检查

Posted

技术标签:

【中文标题】Spring Security 预认证账户锁定检查【英文标题】:Spring Security Pre Authentication Account Lock Check 【发布时间】:2013-06-26 23:45:51 【问题描述】:

新手问题...我已经成功实现了自定义处理程序和服务(自定义用户详细信息服务、身份验证成功、身份验证失败)并且一切正常。我现在还实现了一个功能,如果他们未能通过身份验证 3 个并发时间,将锁定一个帐户(一段时间)。

我现在将继续处理当用户尝试在拥有帐户锁定时进行身份验证的情况。如果锁定处于活动状态 > 不应尝试身份验证并将用户重定向到锁定的帐户页面/错误。如果锁已过期 > 应移除锁并正常进行身份验证

在帐户锁定处于活动状态的情况下 - 我已尝试在自定义身份验证成功处理程序中实现此功能,但尽管成功将用户转发到帐户锁定错误页面 - 为时已晚,因为应用程序已经验证了用户并且用户能够成功地直接访问安全页面(这显然是错误的,因为他们的帐户应该被锁定)。

我开始玩,但我想我会先在这里查看更标准/优雅的解决方案/方法。我应该在自定义用户详细信息服务中执行此检查和操作,还是在用户点击自定义用户详细信息服务之前我可以实施预身份验证处理程序?任何有关我可以在哪里/如何处理此问题的帮助或建议将不胜感激

【问题讨论】:

【参考方案1】:

在您的 UserDetails 实现中,将 true 传递给以下值

    isAccountNonExpired() isAccountNonLocked() isCredentialsNonExpired()

更多细节可以查看AbstractUserDetailsAuthenticationProvider类中的public void check(UserDetails user)。希望这对某人有所帮助。

【讨论】:

【参考方案2】:

有内置的 LockedException。如果 UserDetails.isAccountNonLocked() == false,它将由 AuthenticationManager 抛出。因此,您可以在 UserDetailsS​​ervice.loadUserByUsername(...) 方法中执行检查。创建新的用户对象时,只需为 accountNonExpired 参数传递 false 值。

【讨论】:

【参考方案3】:

UserDetails实现类中使用以下四个方法作为true,以防止锁定您的测试帐户。

    @Override
    public boolean isAccountNonExpired() 
        return true;
    

    @Override
    public boolean isAccountNonLocked() 
        return true;
    

    @Override
    public boolean isCredentialsNonExpired() 
        return true;
    

    @Override
    public boolean isEnabled() 
        return true;
    

【讨论】:

我遇到了与原始问题相同的问题。将 4 种方法设置为 true 修复了登录问题。我可以将这 4 种方法设置为 true in,比如说生产吗?我的印象是将其设置为返回 false 应该是默认值。不过,我还没有读到很多关于它的内容。

以上是关于Spring Security 预认证账户锁定检查的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security---多次登录失败账户锁定详解

Spring Boot 2 安全性 - 预认证令牌 - 允许运行状况检查

spring security预认证用户登录

spring security认证源码分析之账户权限

使用 Spring Security 无需授权的预认证

使用 Spring Security 的预认证/单点登录