Java UserDetailsService在SpringSecurity的AuthenticationManager中扮演什么角色?

Java UserDetailsService在SpringSecurity的AuthenticationManager中扮演什么角色?,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我正在尝试创建一个登录页面,如果登录成功,该页面将返回JWT,但我无法理解某些功能是如何工作的。我目前正在学习一个关于JWT身份验证的不错的教程,作者在其中创建了一个“/login”端点,它看起来像: @PostMapping("/login") public String login(@RequestBody LoginUserDto loginUser) { try{ authenticationManager.authenticate(new UsernamePassw

我正在尝试创建一个登录页面,如果登录成功,该页面将返回JWT,但我无法理解某些功能是如何工作的。我目前正在学习一个关于JWT身份验证的不错的教程,作者在其中创建了一个“/login”端点,它看起来像:

@PostMapping("/login")
public String login(@RequestBody LoginUserDto loginUser) {
    try{
      authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(//email,//password));
    }catch(BadCredentialsException exception) {....}

    final UserDetails userDetails = userDetailsService.loadUserByUsername(//email);
    return createToken(userDetails.getUsername());     
}
如果
authenticate()
方法没有抛出任何
BadCredentialsException
,为什么他仍在调用
userDetailsService.loadUserByUsername()

无论如何,我已经看到这个
userDetailsService
是在
websecurityConfigureAdapter
类中配置的:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userService)
            .passwordEncoder(NoOpPasswordEncoder.getInstance());
}

但是,如果他使用
AuthenticationManager
,那么此
UserDetailsService
的目的是什么?因为我在几乎每一个教程中都看到了我需要实现这个接口的内容…

使用
userdetails服务
从后端结构(如数据库)加载用户。当用户尝试使用用户名和密码登录时,将调用
loadUserByUsername
方法。方法
loadUserByUsername
返回一个
UserDetails
对象,您可以从中获取用户的身份验证和授权信息(来自域用户的更具体信息,如:员工编号、全名)。因此,您可能需要它在应用程序流程中进行更详细的使用,比如了解用户全名是否符合逻辑。调用authenticationManager.authenticate可以根据提供程序(LDAP、数据库、OAUTH等)检查凭据

创建自定义
UserDetailsService
对象是一种简单的机制,它允许Spring Security根据自定义域模型做出安全决策Spring Security需要
UserDetailsService
才能使用内置的记忆我支持,并且
UserDetailsService
对象在身份验证不基于用户名和密码时不起作用