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

5.security/JwtAuthenticationRequest

用于表示JWT(JSON Web Token)身份验证请求,这个类实现了Serializable接口,意味着其对象可以被序列化,以便于在网络传输或存储到文件中

public class JwtAuthenticationRequest implements Serializable:声明了一个公共类JwtAuthenticationRequest,并且实现了Serializable接口

serialVersionUID = -849270125785286560L:定义了一个serialVersionUID字段作为序列化版本号,它是序列化时用于验证版本一致性的,如果类的结构在序列化后发生改变,这个ID可以帮助检测并防止反序列化时出现不兼容的情况

@Schema(required = true):使用Schema注解来标记接下来的字段,required = true表示这个字段在API请求中是必需的

private String username:定义了一个私有的String类型字段username,用于存储用户名

private String password:定义了一个私有的String类型字段password,用于存储密码

JwtAuthenticationRequest() :无参数构造方法

JwtAuthenticationRequest(String username, String password):创建JwtAuthenticationRequest初始化对象时同时设置username用户名和password密码

获取用户名和密码:

public String getUsername() 和setUsername(String username):这两个方法是username字段的getter和setter方法,分别用于获取和设置username字段的值

public String getPassword()和public void setPassword(String password):同理是password字段的getter和setter方法,分别用于获取和设置password字段的值

JwtAuthenticationRequest用于存储JWT身份验证请求中的用户名和密码信息,实际用于处理来自客户端的认证请求,然后这些请求被发送到认证服务器进行验证,通过定义 JwtAuthenticationRequest 类,可以方便地封装和传递身份验证请求的相关信息

6.security/JwtAuthenticationResponse

JwtAuthenticationResponse类用于表示JWT身份验证的响应,实现了Serializable接口,这个类的对象可以被序列化为字节流,以便于存储或网络传输

定义了一个公共类JwtAuthenticationResponse,并且实现了Serializable接口

序列化版本ID:serialVersionUID = 7807174184779512457L用于在序列化和反序列化过程中验证版本一致性,如果类的结构在序列化后发生了改变,而serialVersionUID没有相应地更新,那么在反序列化时将会抛出InvalidClassException

定义不可变的私有字段token,用于存储JWT令牌信息,初始化之后就不能再改变

 JwtAuthenticationResponse(String token) :给token赋值,初始化JwtAuthenticationResponse对象时设置JWT令牌

getToken():公共的getter方法`,用于获取token字段的值,即获取JWT令牌信息,用于返回存储在对象中的JWT令牌

JwtAuthenticationResponse用于封装JWT认证过程中的认证令牌(token),在JWT认证流程中,服务器在验证客户端提供的用户名和密码后,会生成一个JWT token并返回给客户端,客户端在后续的请求中会将这个token作为凭证发送给服务器以验证身份,以便客户端在后续的请求中携带该令牌来进行身份验证和授权操作,这个类就是用于接收和封装这个token的

7.security/JwtAuthenticationToken

JwtAuthenticationToken类继承了Spring Security框架中的AbstractAuthenticationToken类,用于表示一个基于JWT(JSON Web Token)的身份验证令牌

公共类JwtAuthenticationToken,继承了AbstractAuthenticationToken类

定义了一个私有的String类型字段token,用于存储JWT令牌信息

JwtAuthenticationToken(String authToken):初始化设置JWT令牌,接受一个String类型的参数authToken,super(null)调用父类AbstractAuthenticationToken的构造方法,并传入null作为身份验证的凭证,将传入的authToken赋值给类的token字段

Getter和Setter方法:getAuthToken(),setAuthToken(String authToken)获取和设置token字段的值,即获取和设置JWT令牌信息,返回存储在对象中的JWT令牌和更新JWT令牌

getCredentials(), getPrincipal() :分别用于获取认证令牌的凭证和主体

JwtAuthenticationToken类中这两个方法都被重写并返回null,可能是因为在这个特定的实现中,JwtAuthenticationToken不直接包含凭证或主体的信息,或者这些信息在别的地方被处理

JwtAuthenticationToken类扩展了Spring Security的AbstractAuthenticationToken类,以表示一个基于JWT的认证令牌,包含了一个私有字段token来存储JWT令牌,并提供了获取和设置这个令牌的方法

8.security/JwtAuthenticationTokenFilter

定义JwtAuthenticationTokenFilter类用于实现基于JWT令牌的身份验证过滤器,过滤器主要用于处理HTTP请求中的JWT身份验证信息

public class JwtAuthenticationTokenFilter extends OncePerRequestFilter:定义了一个名为 JwtAuthenticationTokenFilter的类,继承自OncePerRequestFilter类,表示该类是一个过滤器,过滤器在整个请求生命周期中只执行一次,确保每个请求只被过滤一次

声明了一些常量和字段:

private final String AUTHORIZATION = "Authorization":定义了表示授权信息的常量字符串,请求头中认证信息的键名

private final String BEARER = "Bearer ":定义了表示JWT令牌类型的常量字符串,JWT认证通常使用的前缀

private final String TOKEN = "token":查询参数中认证信息的键名

private AuthenticationManager authManager:用于执行身份验证管理的字段

private WebAuthenticationDetailsSource detailsSource:用于获取Web身份验证细节的字段

使用@Autowired注解注入依赖:

setAuthenticationManager(AuthenticationManager authenticationManager):用于设置authManager,注入身份验证管理器

setDetailsSource(Optional<WebAuthenticationDetailsSource> detailsSource):用于设置detailsSource,注入Web身份验证细节源,如果传入的detailsSource是存在的(isPresent()返回true)则使用它,否则创建一个新的WebAuthenticationDetailsSource

@Override注解下对父类的重写:

doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain):实现过滤器的核心逻辑,从请求中获取授权信息,并根据不同情况进行身份验证

首先从请求中获取Authorization头信息(authHeader)和token的查询参数(bearerParam)。然后检查authHeader是否非空且以BEARER前缀开始,如果是则会从authHeader中提取出JWT令牌(authToken),并调用authenticate方法进行认证,如果authHeader不满足条件,但bearerParam存在且长度大于0,则使用查询参数中的令牌进行认证

无论是否进行了认证,都会调用chain.doFilter(request, response)以确保请求可以继续传递给后续的过滤器或目标资源

authenticate(HttpServletRequest request, String authToken):进行身份验证,首先检查当前是否已经有认证信息存在,如果没有则创建一个JwtAuthenticationToken对象,设置相应的身份验证细节,然后尝试进行身份验证操作,并将验证结果存储到SecurityContextHolder中

设置认证详情:

token.setDetails(detailsSource.buildDetails(request)):使用detailsSource(Web认证详情源)从当前的HTTP请求中构建认证详情,并设置到JwtAuthenticationToken实例中

执行认证:

try {} catch (Exception e): 使用try-catch块来捕获可能发生的异常

Authentication auth = authManager.authenticate(token):调用AuthenticationManager的authenticate方法,传入JwtAuthenticationToken实例进行认证。如果认证成功,该方法将返回一个填充了用户信息的Authentication对象,如果认证失败,则抛出异常

设置认证结果到安全上下文:

if (auth != null) { }:如果认证成功(即auth不为null),则将认证结果设置到SecurityContextHolder的上下文中,这样后续的代码就可以通过SecurityContextHolder获取到当前认证的用户信息

异常处理:

catch (Exception e) { }: 当前的异常处理是空的,处于忽略异常的状态

JwtAuthenticationTokenFilter实现了一个基于JWT令牌的身份验证过滤器,通过检查请求中的授权信息来实现身份验证,并将验证结果存储在安全上下文中,以便后续的授权和访问控制

  • 35
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值