spring security token 有效期_记一次token安全认证的实践

763343e7f741c60457a6bd98fe9117e5.png
本文作者:[Java知音] 瑾似流年

推荐阅读

1. Java 性能优化:教你提高代码运行的效率

2. 基于token的多平台身份认证架构设计

3. select count(*)底层究竟做了什么?

4. Springboot启动原理解析

阅读此文前请先阅读上一篇SpringBoot整合JWT实现用户认证了解JWT

背景介绍:

因项目需求,有PC端 APP端和小程序端,但登陆接口是同一个,然而微服务也无法使用传统的session解决用户登录问题(注意这里是传统的session不是spring session),使用户信息在其他服务共享。

如此一来就想到了token安全认证,而JWT生成token可以包含用户信息,也就果断选择了JWT作为SpringCloud gateway网关的token校验工具,这样,我们便可以直接解析token获取用户信息了。

具体实现思路:

  1. 让JWT在其他所有服务可以共同使用,父工程需要引入JWT jar。避免在其他服务重复引入。
  2. 如何使用JWT生成token。
  3. 如何解析token。
  4. 如何让网关拦截用户请求校验token。
  5. 如何避免首次登录被网关拦截。

代码实现:

1.创建SpringCloud项目

SpringCloud子项目包含 eureka,gateway,auth三个工程,父工程maven依赖如下。

<dependency>
    

2.Auth和gateway编写TOKEN工具类

public 

特别提示:以上工具类可以在用户登录授权接口中调用,用以生成token,示例代码如下(可以借鉴不可复制哦,请根据自己业务逻辑在合适的地方调用TOKEN工具)

@RestController

好了,此时呢,我们已经通过auth工程完成了用户登录授权,并且生成了token。那么如何在gateway网关中进行token认证呢?

3.gateway网关中编写JwtCheckGatewayFilterFactory过滤器。

此类需要继承gateway的AbstractGatewayFilterFactory。

代码实现如下:

首先gateway网关yml文件中需要代理auth路由。

spring:
cloud:
    gateway:
      routes:
      - id: neo_route
        uri: lb://YUNXI-AUTH
        predicates:
        - Path=/auth/**
        filters:
        - StripPrefix=1
        - JwtCheck

自定义 JwtCheckGatewayFilterFactory 继承 AbstractGatewayFilterFactory 抽象类,代码如下:

public 

编写config文件将JWT认证过滤器添加到Spring bean中。

@Configuration

此时我们就完成了整个token认证过程,其实简单的来说就是:

  • 第一步:Auth工程配合用户登录生成token,并将token和用户信息存储在redis中。
  • 第二步:在gayeway中编写JWT认证过滤器,用以校验用户请求中携带的token。

有图有真相

8a3b34f151256e148e6842eab1dac653.png

特别提示:我的auth工程端口是8766,登录认证接口路由是/currency/login。而此时我请求的认证接口是/main/currency/login,端口是8765,我们在文章开头就已说明,gateway网关在yml文件中配置auth代理为auth/,和这里的main是同一个道理。

如果此时我们再去请求项目中其他端口携带过期的token试试看效果:

91726b1dd04e047d3d5f5009d96eaff9.png

我们登陆认证返回的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;

携带的其他过期的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjQ1NjUwNzIwMiwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1Nzc1MjUwNzIwMn0._yF2TeaR4MTmF-Re9QciMZOeRKBOQmfvi3o4hWeGSMU

再携带错误的token试试看:

64383b382e6f64e573f51af7e92e9f13.png

登陆认证返回的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;

携带错误的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlD

携带正确的token:

7414bcbf3318c59fe84349a2e66bb673.png

到这里我么你的整个SpringCloud gateway网关+JWT安全认证就结束啦,非常抱歉,由于项目保密性不能为大家提供项目源码。但是整个过程我已经写的非常详细,也不希望大家做伸手党,如果有各种疑问欢迎留言,我可以帮大家一一解决。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值