【SpringSecurity】【JJWT】JJWT踩坑LocalDateTime

前言

最近自己又在开始闲搞,主要原因还是下山无望(买显卡)。只能晚上下班找点事情做啦~~

环境

版本请根据实际情况参考JJWT官网选择使用,这里只说明一下问题大概思路!

<!-- 增加token生成依赖 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.4</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <scope>runtime</scope>
    <version>0.11.4</version>
</dependency>
<!-- 该依赖根据当前项目json解析器选择: 如果选择gson 则引入 jjwt-gson -->
<!-- 需要自定义序列化器, 需注释掉runtime域 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.4</version>
<!--<scope>runtime</scope>-->
</dependency>

问题

最近在重新学习SpringSecurity + JJWT完成整体令牌… 然后就遇到了下面的问题…

简单描述下,问题的根本就是JJWT源码中会寻找当前项目默认使用 ‘JacksonSerializer’ ,源码贴出来看一下,可以看出来如果没有通过构造方法传入一个新的ObjectMapper时,默认使用最基本的对象来进行序列化操作。而默认new出来最基本的序列化对象,是不支持序列化LocalDateTime的。

JJWT中JacksonSerializer源码:

    static final ObjectMapper DEFAULT_OBJECT_MAPPER = new ObjectMapper();

    private final ObjectMapper objectMapper;

    @SuppressWarnings("unused") //used via reflection by RuntimeClasspathDeserializerLocator
    public JacksonSerializer() {
        this(DEFAULT_OBJECT_MAPPER);
    }

    @SuppressWarnings("WeakerAccess") //intended for end-users to use when providing a custom ObjectMapper
    public JacksonSerializer(ObjectMapper objectMapper) {
        Assert.notNull(objectMapper, "ObjectMapper cannot be null.");
        this.objectMapper = objectMapper;
    } ```

错误结果在这里插入图片描述

解决办法

解决问题首先思路肯定是从源码出发,我们从源码中可以看出来,JJWT已经为我们预留了重写默认ObjectMapper的方式了,既然这样最简单的解决方式就是利用 ‘JacksonSerializer’ 中的有参构造来覆写入支持序列化 ‘LocalDateTime’ 的ObjectMapper就可以了.
在这里插入图片描述
当然接下来肯定有人要问了,这个构造方法应该在什么时候调用呢?

别着急嘛,正要说到这里~~

JJWT目前提供的计算令牌的方式是通过 ‘Jwts’ 类来进行链式调用完成令牌计算,解析的。
示例如下:

// 获取令牌
Jwts.builder()
    .setClaims(claims)
    .signWith(secretKey(secret))
    .compact();
// 解析令牌
Jwts.parserBuilder()
     .setSigningKey(secretKey(secret))
     .build()
     .parseClaimsJws(token)
     .getBody();

既然知道这个类主要提供给我们用来操作的,那我们就可以在类中查找一下是否提供了序列化的方法。(最好还是先查看文档哦,避免盲目寻找浪费时间,这里我就直接贴出来官方的翻译(仅供参考 ))

自定义 JSON 处理器
如果您不想使用 JJWT 的运行时依赖方式,或者只是想自定义 JSON 序列化和反序列化的工作方式,则可以实现 Serializer 和 Deserializer 接口,并分别在 JwtBuilder 和 JwtParserBuilder 上指定它们的实例。例如:

When creating a JWT(创建JWT时):

//implement me

Jwts.builder()

    .serializeToJsonWith(serializer)
    
    // ... etc ... ```

When reading a JWT(读取 JWT 时):

getMyDeserializer(); //implement me

Jwts.parserBuilder()

    .deserializeJsonWith(deserializer)
    
    // ... etc ... ```

w(゚Д゚)w 看完文档是不是豁然开朗,接下来只需要将自定义可以序列化万物的 serializer 交出来就可以了~

// PS. 这是两个分开的方法哦 记住了吗~
Jwts.builder()
     // 使用项目配置的json序列化器
     .serializeToJsonWith(new JacksonSerializer<>(JsonUtil.MAPPER))
     .setClaims(claims)
     .signWith(secretKey(secret))
     .compact();
// ----------------------------------
Jwts.parserBuilder()
     .deserializeJsonWith(new JacksonDeserializer<>(JsonUtil.MAPPER))
     .setSigningKey(secretKey(secret))
     .build()
     .parseClaimsJws(token)
     .getBody();

测试验证结果

在这里插入图片描述
؏؏☝ᖗ乛◡乛ᖘ☝؏؏

验证通过,完结撒花~

对了,还有配置ObjectMapper LocalDateTime序列化器的方法我就不单独贴出来了,有很多现成的,可以度娘自行获取 ┏(^0^)┛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Spring Security与JWT(JSON Web Token)是一种常见的组合,用于实现身份验证和授权机制。 JWT是一种轻量级的身份验证和授权的解决方案,它使用JSON格式来定义安全声明。JWT通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含算法和令牌类型等信息,载荷包含用户身份和其他相关信息,签名用于验证令牌的完整性和真实性。 Spring Security提供了对JWT的支持,并可以与Spring Boot框架无缝集成。您可以通过以下步骤来实现Spring Security + JWT的集成: 1. 添加依赖:在项目的构建文件中,添加Spring Security和JWT相关的依赖,如spring-boot-starter-security和jjwt。 2. 配置Spring Security:创建一个继承自WebSecurityConfigurerAdapter的配置类,并重写configure方法来配置Spring Security。在该方法中,您可以定义身份验证和授权规则。 3. 创建JWT工具类:创建一个JWT工具类,用于生成、解析和验证JWT。您可以使用jjwt库来处理JWT操作。 4. 实现用户认证:在Spring Security配置类中,您可以实现UserDetailsService接口,并重写loadUserByUsername方法来根据用户名加载用户信息。在该方法中,您可以从数据库或其他数据源中获取用户信息,并构建一个UserDetails对象返回。 5. 实现JWT过滤器:创建一个自定义的过滤器,用于解析和验证传入请求中的JWT。在该过滤器中,您可以使用JWT工具类来解析JWT,并将用户信息添加到Spring Security的上下文中。 6. 配置Spring Security过滤器链:在Spring Security配置类中,将JWT过滤器添加到过滤器链中,以确保每个请求都经过JWT验证。 通过以上步骤,您可以实现Spring Security与JWT的集成,实现基于JWT的身份验证和授权机制。这样,您可以使用JWT生成和验证令牌,并通过Spring Security保护您的应用程序资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Confused_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值