【问题标题】:How to check that BadCredentialsException is not thrown in loadUserByUsername如何检查是否在 loadUserByUsername 中未抛出 BadCredentialsException
【发布时间】:2024-05-21 22:35:01
【问题描述】:

我正在使用 UserDetailsS​​ervice 对我的用户进行身份验证:

<authentication-manager alias="authenticationManager">          
      <authentication-provider user-service-ref="userDetailsService">
         <password-encoder hash="sha"/>             
      </authentication-provider>   
    </authentication-manager> 

userDetailsS​​ervice 类:

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;


    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

User user = null;
    try {
        user = userService.getUserByUsername(username);
    } catch (Exception e) {
        e.printStackTrace();
    }


   if (user.isForceChangePass()) {
        MyForcePasswordChangeException bad = new MyForcePasswordChangeException(
                "Password is not valid, and it must be changed!");
        throw bad;
    }

}

编辑:

在获取用户名后,我检查 ForceChangePass 指示器,如果它是真的,我通过我自己的异常将用户登陆到 loginFailureHandler(尽管密码正确与否)我想在 loginFailureHandler 中检查我的异常是否被抛出以防万一仅登录成功。

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    loadUserByUsername() 不应该检查凭据,它应该只加载UserDetails 对象(具有getPassword() 方法)或抛出UsernameNotFoundException

    如果要检查用户是否成功认证,请查看Listening to successful login with Spring Security

    <form-login 
      authentication-success-handler-ref="authenticationSuccessHandler"
      authentication-failure-url="authenticationFailureHandler"/>
    

    您必须实现AuthenticationSuccessHandlerAuthenticationFailureHandler

    或者考虑继承 BasicAuthenticationFilter 并覆盖 onSuccessfulAuthentication()onUnsuccessfulAuthentication()

    【讨论】:

    • 我为我的问题添加了更多详细信息。
    • @fresh_dev: 在AuthenticationSuccessHandler 中检查ForceChangePass 怎么样,如果设置,使会话无效并将用户重定向到更改密码页面?您已准备好所有部分(Authentication,请求和响应)