使用Spring Security 4.0.2.RELEASE
对于使用spring-security框架的基本用户身份验证,我实现了spring-security DaoAuthenticationProvider
当用户尝试使用正确的用户名登录时,不正确的密码和用户的帐户已被锁定,那么我预计spring-security身份验证模块会抛出{{1但是它会抛出BadCredentialsException
我的问题是
LockedException
无效密码和锁定用户?任何帮助将不胜感激。身份验证提供程序实现代码是
BadCredentialsException
答案 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
检查未过期的凭据好的一点是,preAuthenticationChecks
和postAuthenticationChecks
是对接口UserDetailsChecker
的引用,因此您可以更改它们。只需实现自己的两个UserDetailsChecker
,一个Null-Implementation for pre,一个用于检查所有内容的帖子:
!user.isAccountNonLocked()
!user.isEnabled()
!user.isAccountNonExpired()
!user.isCredentialsNonExpired()