我将 org.springframework.security.core.userdetails.User 子类化,并在我的构造函数中调用:
Super (String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
GrantedAuthority[] authorities)
然后我使用 ${SPRING_SECURITY_LAST_EXCEPTION.message}
在登录失败时显示结果。
我遇到的问题是,如果我将 accountNotLocked 设置为 false,则会显示帐户锁定错误消息,并且无论密码是否正确都会发生这种情况。如果 spring 首先验证凭据然后启用 accountNonExpired、credentialsNonExpired 和 accountNonLocked 标志,我会更喜欢它。这样,用户只有在获得正确的凭据后才会收到他们的帐户被锁定的通知。
有没有办法强制 spring 这样做?
最佳答案
我假设您使用的是最流行的 DaoAuthenticationProvider
问题出在 UserDetailsChecker
此类中的默认实现。也就是说,在 DaoAuthenticationProvider.additionalAuthenticationChecks
之后移动所有检查应该足以解决您的问题。尝试以下配置:
<authentication-manager alias="authenticationManager">
<authentication-provider ref="daoAuthenticationProvider" />
</authentication-manager>
<bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userDetailsService"/>
<property name="passwordEncoder" ref="passwordEncoder"/>
<property name="preAuthenticationChecks"
class="com.example.NullUserDetailsChecker"/>
<property name="postAuthenticationChecks"
class="org.springframework.security.authentication.AccountStatusUserDetailsChecker"/>
</bean>
其中 com.example.NullUserDetailsChecker
是 null object pattern UserDetailsChecker
的实现(具有不执行任何操作的 void 检查方法)。
关于java - 强制 Spring 安全性在帐户状态标志之前检查凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973619/