本文作者:[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获取用户信息了。
具体实现思路:
- 让JWT在其他所有服务可以共同使用,父工程需要引入JWT jar。避免在其他服务重复引入。
- 如何使用JWT生成token。
- 如何解析token。
- 如何让网关拦截用户请求校验token。
- 如何避免首次登录被网关拦截。
代码实现:
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。
有图有真相
特别提示:我的auth工程端口是8766,登录认证接口路由是/currency/login。而此时我请求的认证接口是/main/currency/login,端口是8765,我们在文章开头就已说明,gateway网关在yml文件中配置auth代理为auth/,和这里的main是同一个道理。
如果此时我们再去请求项目中其他端口携带过期的token试试看效果:
我们登陆认证返回的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;
携带的其他过期的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjQ1NjUwNzIwMiwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1Nzc1MjUwNzIwMn0._yF2TeaR4MTmF-Re9QciMZOeRKBOQmfvi3o4hWeGSMU
再携带错误的token试试看:
登陆认证返回的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;
携带错误的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlD
携带正确的token:
到这里我么你的整个SpringCloud gateway网关+JWT安全认证就结束啦,非常抱歉,由于项目保密性不能为大家提供项目源码。但是整个过程我已经写的非常详细,也不希望大家做伸手党,如果有各种疑问欢迎留言,我可以帮大家一一解决。