接上一篇:SpringCloud Gateway 集成 oauth2 实现统一认证授权
文章目录
- 一、目前存在的问题
- 1. 问题简述
- 2. 集成nacos前配置
- 3. 前言简述
- 二、网关模块改造集成nacos
- 2.1. 引入依赖
- 2.2. 创建bootstrap.yaml
- 2.3. 在nacos配置中心添加配置
- 2.4. 启动服务
- 2.5. 访问产品模块
- 2.6. 获取toeken
- 2.7. 携带toekn访问产品模块
- 2.8. 怎样证明配置动态刷新呢
- 三、利用注册中心动态路由
- 3.1. 查看服务列表
- 3.2. 应用名称替换ip和端口
- 3.3. 重新请求
一、目前存在的问题
1. 问题简述
- SpringCloudGateway的路由规则写死在配置文件中,无法支持动态更新
- 路由规则如何与服务注册中心联动
2. 集成nacos前配置
spring:cloud:gateway:routes:- id: producturi: http://localhost:9000predicates:- Host=product.gblfy.com**- id: authuri: http://localhost:5000predicates:- Path=/oauth/tokendatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/auth-serv?characterEncoding=UTF-8&serverTimezone=GMT%2B8username: rootpassword: 123456
3. 前言简述
首先咱们这篇基于SpringCloudGateway集成授权认证中心的oauth2的因此,发起请求之前需要先通过网关访问认证授权中心auth-serv获取token才可以访问后面的模块。
二、网关模块改造集成nacos
2.1. 引入依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><spring.cloud-version>Hoxton.SR9</spring.cloud-version></properties><dependencies><!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--安全认证框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!--security-oauth2整合--><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-resource-server</artifactId></dependency><!--oauth2--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies><dependencyManagement><!--https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E--><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud-version}</version><type>pom</type><scope>import</scope></dependency><!--spring-cloud-alibaba 版本控制--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
2.2. 创建bootstrap.yaml
server:port: 8081
spring:cloud:nacos:discovery:service: gateway-servserver-addr: localhost:8848config:server-addr: localhost:8848file-extension: yamlshared-configs[0]:dataId: gateway.yaml# 动态刷新refresh: true
将以前application.yml文件的内容,添加到nacos控制台的gateway.yaml
spring:cloud:gateway:routes:- id: producturi: http://localhost:9000predicates:- Host=product.gblfy.com**- id: authuri: http://localhost:5000predicates:- Path=/oauth/tokendatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/auth-serv?characterEncoding=UTF-8&serverTimezone=GMT%2B8username: rootpassword: 123456
2.3. 在nacos配置中心添加配置
新建配置
2.4. 启动服务
启动Gateway-Serv模块服务
启动auth-serv认证授权服务
启动product-serv服务
2.5. 访问产品模块
不请求auth-serv模块获取otken,直接通过网关访问产品模块
从上图可以看出访问需要认证授权
2.6. 获取toeken
http://localhost:8081/oauth/token
通过认证授权中心获取toekn
grant_type:password
client_id:app
client_secret:app
username:ziya
password:111111
2.7. 携带toekn访问产品模块
携带toekn通过网关服务访问产品模块
http://product.gblfy.com:8081/product/1
从图中可以看出,获取token后,通过网关服务可以正常请求产品模块,并有响应报文。
2.8. 怎样证明配置动态刷新呢
修改配置
再次通过网关请求产品服务模块服务
从图中可以看出访问请求拒接了,因为没有9200端口的服务应用。我们现在基于nacos-config配置动态将我们的路由规则管理起来了。
三、利用注册中心动态路由
3.1. 查看服务列表
有3台应用
3.2. 应用名称替换ip和端口
原配置
spring:cloud:gateway:routes:- id: producturi: http://localhost:9200predicates:- Host=product.gblfy.com**- id: authuri: http://localhost:5000predicates:- Path=/oauth/tokendatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/auth-serv?characterEncoding=UTF-8&serverTimezone=GMT%2B8username: rootpassword: 123456
改造后配置
spring:cloud:gateway:routes:- id: producturi: lb://product-servpredicates:- Host=product.gblfy.com**- id: authuri: lb://auth-servpredicates:- Path=/oauth/tokendatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/auth-serv?characterEncoding=UTF-8&serverTimezone=GMT%2B8username: rootpassword: 123456
3.3. 重新请求
http://product.gblfy.com:8081/product/1
Authorization: Bearer d364c6cc-3c60-402f-b3d0-af69f6d6b73e
从上图可以看出可以通过网关服务正常请求产品模块!