Authenticator/src/main/java/authenticator/
1.config/AuthSecurityConfig
Spring Security 的配置类,用于定义应用程序中的安全设置,主要的功能包括配置 JWT (JSON Web Token) 的认证和授权流程
使用 SLF4J 和 Logback 创建了一个名为 logger 的日志记录器,这个日志记录器用于记录有关此配置类的活动
private static Logger logger = LoggerFactory.getLogger(AuthSecurityConfig.class):声明了一个静态的Logger实例,用于记录日志信息
@Configuration:Spring框架内的配置类
• setAuthProvider 方法:
使用 @Autowired 注解自动装配 JwtAuthenticationProvider,配置了一个自定义的认证提供者,将其注册到 Spring Security 的AuthenticationManagerBuilder中。当 Spring Security 需要进行用户认证时,它会使用此 JwtAuthenticationProvider
• setAuthConfig 方法:
于配置 HttpSecurity,这是 Spring Security 的核心组件之一,用于配置 Web 应用程序的安全策略
exceptionHandling().authenticationEntryPoint(new JwtAuthenticationEntryPoint()).and():配置了异常处理,当认证失败时,使用 JwtAuthenticationEntryPoint来处理
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS):配置了会话管理策略为无状态(Stateless),表示不会在服务端保存会话状态,即应用程序不会为每个用户创建和管理 HttpSession,与 JWT 认证一起使用, JWT 本身就是用户的会话信息
addFilterBefore(jwtAuthenticationTokenFilter(),UsernamePasswordAuthenticationFilter.class) 在 UsernamePasswordAuthenticationFilter 之前添加了一个自定义的JwtAuthenticationTokenFilter:用于处理JWT身份验证逻辑,当 HTTP 请求到达时,首先会由 JwtAuthenticationTokenFilter 处理,用于从 JWT 中提取和验证用户信息
• jwtAuthenticationTokenFilter 方法:
@Bean 注解标注,这告诉 Spring 这是一个 Bean 的定义,Spring 容器应该管理这个 Bean 的生命周期。这个过滤器用于处理 JWT 认证相关的逻辑,从请求中提取 JWT,验证其有效性,并将用户信息放入安全上下文中,返回一个新的 JwtAuthenticationTokenFilter
config/AuthSecurityConfig主要基于 JWT(JSON Web Token)认证的配置,包括如何注册自定义的认证提供者,如何配置异常处理和会话管理策略,以及如何添加自定义的 JWT 认证过滤器,这些配置共同构成了应用程序的 JWT 认证和授权流程,以确保应用程序的安全性
2.controllers/AuthenticationController
身份验证控制器类,用于处理JWT(JSON Web Token)用户身份验证相关的请求注解
• @RestController 标识Spring MVC控制器类,用于处理HTTP请求并返回相应的数据
• @Tag 用于定义OpenAPI文档中的标签名称,这里将该控制器标记为"Auth"
• AuthenticationManager:Spring Security的认证管理器,用于执行认证过程
• JwtTokenGenerator:自定义的工具类,用于生成JWT令牌
• AuthenticationController 类:
处理身份验证请求
使用@Autowired注解对AuthenticationManager和JwtTokenGenerator进行自动注入
• 使用@PostMapping注解处理POST请求,路径为"/authentication",接受JSON格式的请求体
• @SecurityRequirements(value = {}):指定这个API端点不需要任何安全要求,即允许未经认证的访问
• createAuthenticationToken() 方法:创建身份验证令牌,首先进行用户身份验证,接收一个JwtAuthenticationRequest对象作为请求体,该对象包含用户名和密码,再调用AuthenticationManager进行认证然后生成JWT令牌并返回给客户端
• @GetMapping注解处理GET请求,路径为"/authentication"
• @PreAuthorize("isAuthenticated()"):只有经过身份验证的用户才能访问此API端点
• getAuthenticationToken() 方法:获取身份验证令牌,首先从SecurityContextHolder中获取当前认证信息,然后生成新的JWT令牌并返回给客户端
• 使用@GetMapping注解处理GET请求,路径为"/checkAuth"
• 注解@PreAuthorize:定义方法的访问控制规则,确保只有经过身份验证的用户可以访问对应的方法
@PreAuthorize("isAuthenticated()"):只有经过身份验证的用户才能访问此API端点
checkAuthenticationToken() 方法:检查身份验证令牌的有效性,首先从SecurityContextHolder中获取当前认证信息,然后根据认证信息返回相应的响应,如果有效,则返回当前认证的用户名username
AuthenticationController实现了一个身份验证控制器,提供了JWT身份验证的核心功能,包含了用户登录时创建身份验证令牌、获取身份验证令牌以及检查身份验证令牌有效性的功能,并通过@PreAuthorize注解实现了访问控制
3.security/JwtAuthenticationEntryPoint
定义了一个 Spring Security 的 AuthenticationEntryPoint,名为 JwtAuthenticationEntryPoint。AuthenticationEntryPoint 是 Spring Security 中的一个接口,用于处理当请求到达一个需要认证的端点但用户未认证时的逻辑
@Component:令Spring 自动检测并注册这个类为一个 Bean,其他组件可通过自动装配引用
• 定义了一个名为 JwtAuthenticationEntryPoint 的公共类,它实现了AuthenticationEntryPoint 接口,并且是可序列化的(实现了 Serializable 接口)
• serialVersionUID = 5875055292765423907L:Serializable 接口要求的成员变量,用于在序列化和反序列化时验证类的版本兼容性
• commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException:
HttpServletRequest request:当前的 HTTP 请求对象,包含请求的所有信息
HttpServletResponse response:当前的 HTTP 响应对象,用于发送响应回客户端
通过 response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized")发送一个 HTTP 401 未授权状态码给客户端,并附带一个“Unauthorized”的消息,告诉客户端因尚未认证或认证失败而没有权限访问请求的资源
JwtAuthenticationEntryPoint 类是 Spring Security 认证流程的一部分,它定义了当用户请求一个需要认证的资源但尚未认证时的处理方式,即直接发送一个 401 未授权状态码给客户端。在实际应用中,根据需求可以添加更复杂的逻辑,例如返回自定义的 JSON 响应体,或者重定向到登录页面等
4.security/JwtAuthenticationProvider
实现了Spring Security AuthenticationProvider接口的类JwtAuthenticationProvider,该类主要用于处理JWT(JSON Web Token)的认证过程
JwtAuthenticationProvider类:
• 成员变量:JwtTokenGenerator类型的变量jwtTokenGenerator,用于生成和验证JWT
• 构造函数和依赖注入:使用@Autowired注解的setJwtTokenGenerator方法用于自动装配JwtTokenGenerator
jwtTokenGenerator:处理JWT的生成和验证,它通过Spring的自动装配功能进行初始化
方法重写:实现了AuthenticationProvider接口的两个方法authenticate和supports
函数或方法的功能和调用方式:
• authenticate(Authentication authentication):处理JWT的认证过程,当Spring Security需要进行认证时,会自动调用此方法。首先,将传入的Authentication对象转型为JwtAuthenticationToken,从JwtAuthenticationToken中获取JWT,使用jwtTokenGenerator从JWT中提取用户名,并验证JWT的有效性,如果用户名不为空且JWT有效,则创建一个新的UsernamePasswordAuthenticationToken实例并返回,其中包含用户名和从JWT中提取的权限信息,如果JWT无效或用户名为空,则返回null
• supports(Class<?> authentication):判断此AuthenticationProvider是否支持给定的认证类型,Spring Security在认证前会调用此方法,以确定使用哪个AuthenticationProvider进行认证。通过检查传入的认证类型是否是JwtAuthenticationToken或其子类来判断是否支持,当Spring Security需要进行认证时,首先会调用supports方法判断哪个AuthenticationProvider应该被使用,如果supports方法返回true,则调用authenticate方法进行具体的认证处理。在authenticate方法中,首先从JwtAuthenticationToken中获取JWT,然后提取用户名并验证JWT的有效性,根据JWT的有效性和提取的用户名,返回相应的Authentication对象或null