乐趣区

关于java:支持Nacos-210这套Spring-Cloud-Gateway-Oauth2-微服务权限终极解决方案升级了

最近常常有小伙伴问我对于在微服务中应用 Oauth2 的问题,其实之前曾经写过一篇相干文章了。这次抽空把之前文章中的 Demo 给降级了,反对了最新版的 Spring Cloud 和 Nacos。明天再来介绍下这套微服务权限终极解决方案,心愿对大家有所帮忙!

SpringCloud 实战电商我的项目mall-swarm(8.8k+star)地址:https://github.com/macrozheng/mall-swarm

实现思路

首先还是来聊聊这套解决方案的实现思路,咱们现实的解决方案应该是这样的,认证服务负责对立认证,网关服务负责校验认证和鉴权,其余 API 服务则负责解决本人的业务逻辑。平安相干的逻辑只存在于认证服务和网关服务中,其余服务只是单纯地提供服务而没有任何平安相干逻辑。

这套解决方案中相干服务的划分如下:

  • micro-oauth2-gateway:网关服务,负责申请转发和鉴权性能,整合 Spring Security+Oauth2;
  • micro-oauth2-auth:认证服务,负责对登录用户进行认证,整合 Spring Security+Oauth2;
  • micro-oauth2-api:API 服务,受网关服务的爱护,用户鉴权通过后能够拜访该服务,不整合 Spring Security+Oauth2。

降级留神点

  • 这里我的项目的依赖版本都降级了,反对 SpringBoot 2.7.0 和最新版的 Spring Cloud;
<properties>
    <spring-boot.version>2.7.0</spring-boot.version>
    <spring-cloud.version>2021.0.3</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
  • 这里不得不吐槽下 Spring Cloud 的版本号,之前名字采纳了伦敦地铁站的名字,依据字母表的程序来对应版本工夫程序,起初又改成了年份,当初又增加了之前废除的地铁站名字作为别名,真是让人蛊惑;
  • SpringBoot 2.7.0 版本中应用 Maven 插件须要增加版本号;
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>${spring-boot.version}</version>
</plugin>
  • 最新版本的 Spring Cloud 曾经放弃应用 Ribbon 来做负载平衡了,转而应用 LoadBalancer,所以网关服务 micro-oauth2-gateway 中还需增加 LoadBalancer 依赖;
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 如果不增加 LoadBalancer 依赖,从网关调用任意服务会返回 Service Unavailable 错误信息;
{
    "timestamp": "2022-06-28T02:36:31.680+00:00",
    "path": "/auth/oauth/token",
    "status": 503,
    "error": "Service Unavailable",
    "requestId": "c480cefa-1"
}
  • micro-oauth2-auth认证服务须要降级版本,留神应用的 JWT 库也要同步降级;
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.nimbusds</groupId>
        <artifactId>nimbus-jose-jwt</artifactId>
        <version>9.23</version>
    </dependency>
</dependencies>
  • 下载 Nacos 2.1.0 版本,下载地址:https://github.com/alibaba/na…
  • 下载实现后解压到指定目录即可,应用如下命令启动 Nacos;
startup.cmd -m standalone
  • 拜访 Nacos 控制台,应用账号密码 nacos:nacos 进行登录,拜访地址:http://localhost:8848/nacos/

应用

本文仅作为微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现对立认证和鉴权!降级版本的补充,具体代码实现能够参考该文,上面演示下该解决方案中的对立认证和鉴权性能。

  • 首先须要启动 Nacos 和 Redis 服务,而后顺次启动 micro-oauth2-authmicro-oauth2-gatewaymicro-oauth2-api服务,启动实现后 Nacos 服务列表显示如下;
  • 应用明码模式获取 JWT 令牌,拜访地址:http://localhost:9201/auth/oa…
  • 不带 JWT 令牌拜访受爱护的 API 接口,拜访地址:http://localhost:9201/api/hello
  • 带 JWT 令牌拜访受爱护的 API 接口,留神申请头 Authorization 增加 Bearer 前缀,能够失常拜访;
  • 应用获取到的 JWT 令牌拜访获取以后登录用户信息的接口,拜访地址:http://localhost:9201/api/use…
  • 当 JWT 令牌过期时,应用接口返回的 refreshToken 获取新的 JWT 令牌,拜访地址:http://localhost:9201/auth/oa…
  • 应用没有拜访权限的 andy:123456 账号登录,拜访接口时会返回如下信息,拜访地址:http://localhost:9201/api/hello

总结

在微服务零碎中实现权限性能时,咱们不应该把反复的权限校验性能集成到每个独立的 API 服务中去,而应该在网关做对立解决,而后通过认证核心去对立认证,这样才是优雅微服务权限解决方案!

我的项目源码地址

https://github.com/macrozheng…

退出移动版