新手问题...我已经成功实现了自定义处理程序和服务(自定义用户详细信息服务,身份验证成功,身份验证失败),一切正常。我现在还实现了一种功能,如果他们的帐户连续3次失败,将会锁定一个帐户(一段时间)。
当用户尝试在帐户锁定时进行身份验证时,我现在正在处理该方案。如果锁定有效>不应尝试身份验证,并将用户重定向到锁定的帐户页面/错误。如果锁已过期>应该删除锁定并正常进行身份验证
如果帐户锁定处于活动状态 - 我已尝试在我的自定义身份验证成功处理程序中实现此功能,但尽管已成功将用户转发到帐户锁定错误页面 - 但由于应用程序已对用户进行了身份验证,因此已太晚用户可以成功地直接访问安全页面(这显然是错误的,因为他们的帐户应该被锁定)。
我开始玩游戏,但我想我先在这里查看一个更标准/更优雅的解决方案/方法。我应该在自定义用户详细信息服务中执行此检查和操作,还是在用户甚至点击自定义用户详细信息服务之前是否有可以实现的预身份验证处理程序?关于我在何处/如何处理此问题的任何帮助或建议将不胜感激
答案 0 :(得分:0)
内置LockedException。如果UserDetails.isAccountNonLocked()== false,它将由AuthenticationManager抛出。因此,您可以在UserDetailsService.loadUserByUsername(...)方法中执行检查。在创建新的User对象时,只需为accountNonExpired参数传递false值。
答案 1 :(得分:0)
在您的UserDetails实现中,将 true 传递给以下值
有关更多详细信息,您可以在 AbstractUserDetailsAuthenticationProvider 类中检查公共无效检查(UserDetails用户)。希望这对某人有帮助。
答案 2 :(得分: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;
}