实战⼲货!SpringCloudGateway整合OAuth2.0实现分布式统⼀认证授权!⼤家好,我是不才陈某~
今天这篇⽂章介绍⼀下Spring Cloud Gateway整合OAuth2.0实现认证授权,涉及到的知识点有点多,有不清楚的可以看下陈某的往期⽂章。
⽂章⽬录如下:
微服务认证⽅案
微服务网关对比微服务认证⽅案⽬前有很多种,每个企业也是⼤不相同,但是总体分为两类,如下:
1. ⽹关只负责转发请求,认证鉴权交给每个微服务控制
2. 统⼀在⽹关层⾯认证鉴权,微服务只负责业务
你们公司⽬前⽤的哪种⽅案?
先来说说第⼀种⽅案,有着很⼤的弊端,如下:
代码耦合严重,每个微服务都要维护⼀套认证鉴权
⽆法做到统⼀认证鉴权,开发难度太⼤
第⼆种⽅案明显是⽐较简单的⼀种,优点如下:
实现了统⼀的认证鉴权,微服务只需要各司其职,专注于⾃⾝的业务
代码耦合性低,⽅便后续的扩展
下⾯陈某就以第⼆种⽅案为例,整合Spring Cloud Gateway+Spring Cloud Security 整合出⼀套统⼀认证鉴权案例。
案例架构
开始撸代码之前,先来说说⼤致的认证鉴权流程,架构如下图:
⼤致分为四个⾓⾊,如下:
客户端:需要访问微服务资源
⽹关:负责转发、认证、鉴权
OAuth2.0授权服务:负责认证授权颁发令牌
微服务集合:提供资源的⼀系列服务。
⼤致流程如下:
1、客户端发出请求给⽹关获取令牌
2、⽹关收到请求,直接转发给授权服务
3、授权服务验证⽤户名、密码等⼀系列⾝份,通过则颁发令牌给客户端
4、客户端携带令牌请求资源,请求直接到了⽹关层
5、⽹关对令牌进⾏校验(验签、过期时间校验....)、鉴权(对当前令牌携带的权限)和访问资源所需的权限进⾏⽐对,如果权限有交集则通过校验,直接转发给微服务
6、微服务进⾏逻辑处理
针对上述架构需要新建三个服务,分别如下:
名称功能
oauth2-cloud-auth-server OAuth2.0认证授权服
oauth2-cloud-gateway⽹关服务
oauth2-cloud-order-service订单资源服务
案例源码⽬录如下:
认证授权服务搭建
很多企业是将认证授权服务直接集成到⽹关中,这么做耦合性太⾼了,这⾥陈某直接将认证授权服务抽离出来。
认证服务的搭建这⾥就不再细说了,上⼀篇⽂章中已经介绍的很清楚了:
新建⼀个oauth2-cloud-auth-server模块,⽬录如下:
和上篇⽂章不同的是创建了JwtTokenUserDetailsService这个类,⽤于从数据库中加载⽤户,如下:
为了演⽰只是模拟了从数据库中查询,其中存了两个⽤户,如下:
user:具有ROLE_user权限
admin:具有ROLE_admin、ROLE_user权限
要想这个⽣效,还要在security的配置⽂件SecurityConfig中指定,如下图:
另外还整合了注册中⼼Nacos,详细配置就不贴了,可以看源码。有不清楚Nacos,可以看之前⽂章:案例源码已经上传GitHub,关注公号:码猿技术专栏,回复关键词:9529 获取!
⽹关服务搭建
⽹关使⽤的是Spring Cloud Gateway,⽹关如何搭建这⾥就不再细说了,有不清楚的可以看之前⽂章:新建⼀个oauth2-cloud-gateway模块,⽬录如下图:
1、添加依赖
需要添加⼏个OAuth2.0相关的依赖,如下:
2、JWT令牌服务配置
使⽤JWT令牌,配置要和认证服务的令牌配置相同,代码如下:
3、认证管理器⾃定义
新建⼀个JwtAuthenticationManager,需要实现ReactiveAuthenticationManager这个接⼝。认证管理的作⽤就是获取传递过来的令牌,对其进⾏解析、验签、过期时间判定。
详细代码如下:
逻辑很简单,就是通过JWT令牌服务解析客户端传递的令牌,并对其进⾏校验,⽐如上传三处校验失败,抛出令牌⽆效的异常。
抛出的异常如何处理?如何定制返回的结果?
这⾥抛出的异常可以通过Spring Cloud Gateway的全局异常进⾏捕获,这个内容在这篇⽂章有详细介绍。下⾯只贴出关键代码,如下:
4、鉴权管理器⾃定义
经过认证管理器JwtAuthenticationManager认证成功后,就需要对令牌进⾏鉴权,如果该令牌⽆访问资源的权限,则不允通过。
新建JwtAccessManager,实现ReactiveAuthorizationManager,代码如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论