【OpenMBEE的模型管理系统——MMS 】Authenticator部分代码分析(1)

本文详细描述了使用SpringSecurity进行JWT认证的配置,包括AuthSecurityConfig中的认证和授权设置、日志记录、异常处理和会话管理,以及AuthenticationController的身份验证和授权控制。还介绍了JwtAuthenticationEntryPoint和JwtAuthenticationProvider的角色及其作用。
摘要由CSDN通过智能技术生成

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

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值