Spring Security:抛出LockedException而不是BadCredentialsException,为什么?

时间:2015-11-28 09:44:09

标签: java spring spring-security

  

使用Spring Security 4.0.2.RELEASE

对于使用spring-security框架的基本用户身份验证,我实现了spring-security DaoAuthenticationProvider

当用户尝试使用正确的用户名登录时,不正确的密码和用户的帐户已被锁定,那么我预计spring-security身份验证模块会抛出{{1但是它会抛出BadCredentialsException

我的问题是

  1. 为什么spring-security正在处理用户进行进一步的身份验证,而凭据特殊密码不正确?
  2. 即使用户的密码无效,在应用程序中显示“User is Locked”的消息是不错的做法?
  3. 如何设置生成/捕获LockedException无效密码和锁定用户?
  4. 任何帮助将不胜感激。身份验证提供程序实现代码是

    BadCredentialsException

1 个答案:

答案 0 :(得分:6)

你问:

  

Spring Security:抛出LockedException而不是BadCredentialsException,为什么?

这是因为Spring安全性会首先检查帐户是否存在且有效,然后检查密码。

更具体:它是在AbstractUserDetailsAuthenticationProvider.authenticate中完成的。在非常简短的描述中,该方法以这种方式工作:

user = retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication);
...
preAuthenticationChecks.check(user);
additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken) authentication);
...
postAuthenticationChecks.check(user);
  • retrieveUser - 加载用户
  • preAuthenticationChecks.check(user); - DefaultPreAuthenticationChecks:检查锁定...
  • additionalAuthenticationChecks - 检查密码
  • postAuthenticationChecks.check(user); - DefaultPostAuthenticationChecks检查未过期的凭据

好的一点是,preAuthenticationCheckspostAuthenticationChecks是对接口UserDetailsChecker的引用,因此您可以更改它们。只需实现自己的两个UserDetailsChecker,一个Null-Implementation for pre,一个用于检查所有内容的帖子:

  • !user.isAccountNonLocked()
  • !user.isEnabled()
  • !user.isAccountNonExpired()
  • !user.isCredentialsNonExpired()