1、WebSecurityConfigurerAdapter
这个类实现了 Spring Security 的WebSecurityConfigurer接口。它提供默认的安全配置并允许其他类扩展它并通过覆盖其方法来自定义安全配置。
我们的SecurityConfig
类扩展WebSecurityConfigurerAdapter并覆盖了它的一些方法以提供自定义安全配置。
2、CustomUserDetailsService
为了验证用户或执行各种基于角色的检查,Spring 安全需要以某种方式加载用户详细信息。
为此,它由一个名为的接口组成,该接口UserDetailsService具有一个基于用户名加载用户的方法-
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
我们将定义一个CustomUserDetailsService
实现UserDetailsService
接口并提供loadUserByUsername()
方法实现的接口。
请注意,该loadUserByUsername()
方法返回UserDetailsSpring Security 用于执行各种身份验证和基于角色的验证的对象。
在我们的实现中,我们还将定义一个自定义UserPrincipal
类来实现UserDetails
接口,并从方法返回UserPrincipal
对象,loadUserByUsername()。
5.JwtAuthenticationEntryPoint
此类用于将 401 未经授权的错误返回给尝试访问受保护资源而未进行适当身份验证的客户端。它实现了 Spring Security 的AuthenticationEntryPoint接口。
6.JwtAuthenticationFilter
我们将JWTAuthenticationFilter
用来实现一个过滤器——
Authorization
从所有请求的标头中读取 JWT 身份验证令牌- 验证令牌
- 加载与该令牌关联的用户详细信息。
- 在 Spring Security 的SecurityContext. Spring Security 使用用户详细信息来执行授权检查。我们还可以访问存储在
SecurityContext
控制器中的用户详细信息来执行我们的业务逻辑。
7.AuthenticationManagerBuilder和AuthenticationManager
AuthenticationManagerBuilder用于创建一个AuthenticationManager实例,该实例是用于验证用户的主要 Spring Security 接口。
您可以使用AuthenticationManagerBuilder
构建内存中身份验证、LDAP 身份验证、JDBC 身份验证或添加您的自定义身份验证提供程序。
在我们的示例中,我们提供了 customUserDetailsService 和 passwordEncoder 来构建 AuthenticationManager。
我们将使用配置AuthenticationManager
来验证登录 API 中的用户。
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomUserDetailsService customUserDetailsService;
@Autowired
private JwtAuthenticationEntryPoint unauthorizedHandler;
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter();
}
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder
.userDetailsService(customUserDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean(BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}