这边项目在用户登录的时会调用
private final AuthenticationManager authenticationManager;
authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
loginCommand.getUsername(), decryptPassword));
就有疑问,理论上应该查询数据库进行判断的,它是怎么进行的这个流程
AuthenticationManager
是 Spring Security 中的核心接口,负责处理认证请求。它的默认实现是 ProviderManager,内部会遍历一组 AuthenticationProvider 来完成认证。
认证逻辑的实际位置
是在我的UserDetailsServiceImpl类 ,继承了这个Spring Securtiy包下面的 UserDetailsService
public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }
我自己定义的UserDetailsServiceImpl类
public class UserDetailsServiceImpl implements UserDetailsService
要实现接口方法 loadUserByUsername
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { }
1.authenticationManager.authenticate() 最终会调用 UserDetailsServiceImpl.loadUserByUsername() 方法。
2.在 loadUserByUsername() 方法中,会从数据库中加载用户信息(包括用户名、密码等),并封装成 UserDetails 对象返回。
3.Spring Security 会自动比对用户输入的密码与数据库中存储的密码是否一致。