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

9.security/JwtTokenGenerator

定义JwtTokenGenerator类,实现了 Serializable 接口和 TokenService 接口,用于生成和处理JWT令牌

implements Serializable, TokenService: 表示该类实现了Serializable接口,以便可以序列化和反序列化,同时它还实现了TokenService接口,提供与该接口定义相匹配的方法

定义了一系列常量,用于表示JWT中可能包含的声明键(claim keys):

private static final String CLAIM_KEY_USERNAME = "sub":定义了存储用户名的声明键

private static final String CLAIM_KEY_USERID = "id":定义了存储用户ID的声明键

private static final String CLAIM_KEY_CREATED = "created":定义了存储令牌创建时间的声明键

private static final String CLAIM_KEY_ENABLED = "enabled":定义了存储用户是否启用的声明键

private static final String CLAIM_KEY_AUTHORITIES = "authorities":定义了存储用户权限信息的声明键

static Logger logger = LoggerFactory.getLogger(JwtTokenGenerator.class):声明了一个静态的日志记录器,使用SLF4J框架的Logger来记录日志

依赖注入:

private String secret:通过Spring的@Value注解,从配置文件中注入JWT令牌的秘钥

private Long expiration:注入了JWT令牌的过期时间

getUsernameFromToken方法:用于从JWT令牌中提取用户名,调用getClaimsFromToken方法获取JWT的声明集合(Claims对象)。如果Claims对象不为空,则通过claims.getSubject()方法获取用户名,如果在获取用户名过程中出现异常,则会捕获该异常并记录日志

getCreatedDateFromToken方法:用于从JWT令牌中提取创建日期,同样调用getClaimsFromToken方法获取JWT的声明集合。如果Claims对象不为空,则尝试从声明集合中获取创建日期,并将其转换为Date对象,如果在获取创建日期过程中出现异常,则会捕获该异常并记录日志

getExpirationDateFromToken:用于从JWT令牌中提取过期日期,接收一个token字符串作为参数,返回一个Date对象,表示令牌的过期日期;如果提取失败,则返回null。定义一个Date类型的变量expires,并初始化为null,调用getClaimsFromToken方法从令牌中提取Claims对象,如果Claims对象不为空,则通过claims.getExpiration()获取过期日期,如果在提取过期日期的过程中发生异常,捕获该异常并记录日志,返回过期日期expires

getClaimsFromToken:用于解析JWT令牌并返回Claims对象,接收一个token字符串作为参数,返回一个Claims对象,表示令牌的声明集合;如果解析失败,则返回null。定义了一个Claims类型的变量claims,并初始化为null,使用Jwts.parser()来创建一个JWT解析器,通过setSigningKey(getSecretKey())设置解析器的签名密钥,调用parseClaimsJws(token).getBody()来解析令牌并获取Claims对象,如果在解析令牌的过程中发生异常,捕获该异常并记录日志

generateExpirationDate:用于生成一个表示未来某个时间点的Date对象,作为JWT令牌的过期日期。使用System.currentTimeMillis()获取当前时间的毫秒数,将expiration(从配置中注入的过期时间)转换为毫秒,并加到当前时间的毫秒数上,使用得到的总毫秒数创建一个新的Date对象并返回

isTokenExpired:用于检查JWT令牌是否已经过期。调用getExpirationDateFromToken方法获取令牌的过期日期,使用Date对象的before方法比较过期日期和当前日期,如果过期日期在当前日期之前,返回true,否则返回false。

generateToken(UserDetails userDetails):根据UserDetails对象生成JWT令牌。创建一个ArrayList来存储用户的权限,遍历UserDetails对象中的权限,并将其添加到列表中,调用另一个重载的generateToken方法,传入用户名、用户是否启用以及权限列表

generateToken(String principal, Collection<String> authorities):根据用户名和权限集合生成JWT令牌。调用另一个重载的generateToken方法,传入用户名、默认启用状态(true)以及权限集合

generateToken(String principal, boolean enabled, Collection<String> authorities):根据用户名、启用状态以及权限集合生成JWT令牌。创建一个HashMap来存储JWT的声明(claims),向claims中添加用户名、用户ID、启用状态、创建时间以及权限集合,调用另一个重载的generateToken方法,传入这个claims对象

generateToken(Map<String, Object> claims):根据给定的声明(claims)生成JWT令牌。使用Jwts.builder()创建一个JWT构建器,通过setClaims(claims)设置声明,通过setExpiration(generateExpirationDate())设置令牌的过期时间,使用signWith(getSecretKey())设置签名密钥并签名,调用compact()方法生成最终的JWT令牌字符串

getSecretKey():获取用于JWT签名的密钥。使用Keys.hmacShaKeyFor(secret.getBytes())方法根据配置的secret字符串生成一个SecretKey对象

validateToken(String token):验证给定的JWT令牌是否有效。调用isTokenExpired(token)方法来判断令牌是否过期,如果isTokenExpired(token)返回true(即令牌已过期),则validateToken方法返回false,表示令牌无效;如果isTokenExpired(token)返回false(即令牌未过期),则validateToken方法返回true,表示令牌有效

refreshToken(String token):刷新一个已存在的JWT令牌,主要是更新令牌的创建时间。尝试从给定的令牌中提取声明(claims),如果提取成功,更新claims中的创建时间为当前时间,使用更新后的claims生成一个新的JWT令牌,如果在提取声明或生成新令牌的过程中发生异常,捕获该异常并记录日志,返回刷新后的令牌;如果刷新失败,则返回null

getAuthoritiesFromToken(String token):从给定的JWT令牌中提取权限信息,并返回这些权限的集合。创建一个ArrayList来存储从令牌中提取的权限,调用getClaimsFromToken(token)方法从令牌中提取声明(claims),如果成功提取到声明,则检查声明中是否存在CLAIM_KEY_AUTHORITIES键,如果存在,则将该键对应的值转换为ArrayList<String>类型(这里使用了Java的泛型通配符和强制类型转换),遍历这个权限列表,为每个权限创建一个SimpleGrantedAuthority对象,并添加到authorities列表中;如果在提取声明或处理权限的过程中发生异常,捕获该异常并记录日志,返回包含从令牌中提取的权限的集合

JwtTokenGenerator总结:

getUsernameFromToken(String token):从令牌中获取用户名

getCreatedDateFromToken(String token):从令牌中获取创建时间

getExpirationDateFromToken(String token):从令牌中获取过期时间

getClaimsFromToken(String token):解析令牌并获取声明信息

generateExpirationDate():生成令牌的过期时间

isTokenExpired(String token):检查令牌是否已过期

generateToken(UserDetails userDetails):根据用户信息生成令牌

generateToken(String principal, Collection<String> authorities):根据用户主体和权限生成令牌

generateToken(String principal, boolean enabled, Collection<String> authorities):根据用户主体、启用状态和权限生成令牌

generateToken(Map<String, Object> claims):根据声明信息生成令牌

getSecretKey():获取加密密钥

refreshToken(String token):刷新令牌

validateToken(String token):验证令牌是否过期

getAuthoritiesFromToken(String token):从令牌中获取用户权限信息

JwtTokenGenerator 类封装了生成、解析和验证JWT令牌的逻辑,提供了一系列方法用于处理JWT令牌的各种操作,包括生成新的令牌、刷新令牌、验证令牌的有效性以及从令牌中提取用户信息和权限信息等功能

10.security/JwtTokenValidationResponse

JwtTokenValidationResponse类实现了Serializable接口,使其可以被序列化,用于表示JWT令牌验证的响应,特别是从验证过程中提取的用户名信息

private static final long serialVersionUID = 1L:序列化版本号,定义了serialVersionUID,这是Java序列化机制中用于验证版本一致性的唯一标识符,用于在序列化和反序列化中保持版本的兼容性

private final String username: 定义了一个私有的、不可变的字符串类型成员变量username,用于存储JWT令牌验证后提取出的用户名信息

JwtTokenValidationResponse(String username):赋值给类的成员变量username,设置用户名信息

public String getUsername():公共的getter方法,获取成员变量username的值,获取对象中存储的用户名信息

主要用于封装JWT令牌验证后的结果,特别是用户名信息。当JWT令牌被验证后,通常会从中提取出用户名信息,然后将这个信息封装在JwtTokenValidationResponse对象中,以便后续使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值