2

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

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

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

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

4

3 回答 3

8

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

  1. isAccountNonExpired()
  2. isAccountNonLocked()
  3. isCredentialsNonExpired()

有关更多详细信息,您可以检查AbstractUserDetailsAuthenticationProvider类中的public void check(UserDetails user) 。希望这可以帮助某人。

于 2019-05-18T20:00:59.070 回答
0

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

于 2013-07-01T12:35:21.840 回答
0

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

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
于 2021-02-27T10:20:02.150 回答