jet token过期是定时的还是无操作_JWT在开发中的实战操作(附带生产级别代码)...

熬夜熬到差不多晚上2点写的,有用的兄弟,必须给我一个关注和大大的赞了!!!!

21c9a71dd6cf57205fdaa9b8e655952a.png

发了上一篇 jwt 相关后 后反响热烈。如果没有来得及去看的话建议先看上一篇。

但是也遗留了一些问题。应广大读者的要求。所以从实战角度出发解决这些问题。我们基于 springboot 2.1.6.RELEASE 版本搞一些操作来演示如何在实际开发中使用jwt。主要依赖如下

bd3483f08bd3b111fa77269acf52d23f.png

通过spring security 和jwt 进行结合来完整实现基于jwt 的安全控制。spring-security-jwt 是spring官方的jwt工具包 。 核心方法只有一个: org.springframework.security.jwt.JwtHelper; 我们用到的就2个方法,其他自己学习:

  • encode(CharSequence content, Signer signer)顾名思义 编码 需要指定payload 跟签名算法
  • decodeAndVerify(String token, SignatureVerifier verifier)方法 用来 验证token是否合法 同时解码 payload成明文 这里不验证过期时间

这样生成jwt 和验证解密jwt 的方法都有了,我们编写自己的jwt生成方法。还是先设计一下流程:

  • 用户登录 验证通过 返回其两个token
  • access_token 用来日常使用 Bearer Token 过期时间7天(也可以自定义)
  • refresh_token 用来令牌续期。过期时间大于access_token 。 当refresh_token不过期,能为access_token 续期。
  • 上述两个token总是成对出现。

根据生成jwt的方法我们需要进行签名算法实现。这里我们采用RSA算法。通过java 提供的keytool 生成jks文件 或者store 或者公私钥串,看你爱好。我这里生成jks文件作为公私钥存储介质。放到资源目录下, 然后解析jks的核心方法为:

e4734394b735d97f925add4d0bb3e740.png

获取钥匙对配合上面的JwtHelper 我们就能生成自己的jwt token了。jwt token 是可以携带信息的,所以我们会定义一个JwtClaims 作为jwt中间那一段的定义类。生成器方法如下:

6930af32a6ce0923502bb6549375e39d.png

因为上面说了token 成对出现 所以对外我们提供一个TokenPairBuilder 来生成token对。同时为了处理续期问题和校验问题我们把这个token对放入redis。过期时间按照refresh_token的时间来算。这样当access_token过期 就通过refresh 来刷新,当两个都过期就需要重新登录。完美契合了缓存过期时间。每次token对的生成都伴随缓存的token重置。当请求判定token 与缓存不一致就可以防止同时存在两个可用token的问题。而且还可以实现防止多端登录的业务需求。同时下线逻辑或者角色权限更改 都可以通过清除redis中的token来处理。

核心代码清单:

  • SecureUser 自定义spring security userDetails 用来携带定制 的用户信息
  • KeyPairFactory 解析RSA 钥匙对 用来jwt 加解密
  • JwtTokenStorage 对jwt进行储存。通过spring cache 实现 JwtTokenCacheStorage
  • JwtPairBuilder token对生成器
  • JwtAuthenticationFilter jwt token验证过滤器 用来验证请求中的jwt access_token
  • RefreshJwtTokenFilter 刷新token过滤器 处理刷新token 逻辑
  • CustomUsernamePasswordAuthenticationFilter 自定义登录器处理登录参数问题。
  • MultiWebSecurityConfig spring security 安全配置 结合jwt

参考上面代码清单可以看我给的demo, 生产可用 有些地方按照你需要的业务实现

代码地址:gitee.com/felord/dax-backend.git

有什么疑问可留言,不行了扛不住了。

97534af6a4c0b4243a1f0a293179d7ca.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值