支援Nacos 2.1.0!這套Spring Cloud Gateway + Oauth2 微服務許可權終極解決方案升級了!

語言: CN / TW / HK

最近經常有小夥伴問我關於在微服務中使用Oauth2的問題,其實之前已經寫過一篇相關文章了。這次抽空把之前文章中的Demo給升級了,支援了最新版的Spring Cloud和Nacos。今天再來介紹下這套微服務許可權終極解決方案,希望對大家有所幫助!

SpringCloud實戰電商專案mall-swarm(8.8k+star)地址:http://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;

xml <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外掛需要新增版本號;

xml <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依賴;

xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>

  • 如果不新增LoadBalancer依賴,從閘道器呼叫任意服務會返回Service Unavailable錯誤資訊;

json { "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庫也要同步升級;

xml <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版本,下載地址:http://github.com/alibaba/nacos/releases

  • 下載完成後解壓到指定目錄即可,使用如下命令啟動Nacos;

bash 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/oauth/token

  • 不帶JWT令牌訪問受保護的API介面,訪問地址:http://localhost:9201/api/hello

  • 帶JWT令牌訪問受保護的API介面,注意請求頭Authorization新增Bearer字首,可以正常訪問;

  • 使用獲取到的JWT令牌訪問獲取當前登入使用者資訊的介面,訪問地址:http://localhost:9201/api/user/currentUser

  • 當JWT令牌過期時,使用介面返回的refreshToken獲取新的JWT令牌,訪問地址:http://localhost:9201/auth/oauth/token

  • 使用沒有訪問許可權的andy:123456賬號登入,訪問介面時會返回如下資訊,訪問地址:http://localhost:9201/api/hello

總結

在微服務系統中實現許可權功能時,我們不應該把重複的許可權校驗功能整合到每個獨立的API服務中去,而應該在閘道器做統一處理,然後通過認證中心去統一認證,這樣才是優雅微服務許可權解決方案!

專案原始碼地址

http://github.com/macrozheng/springcloud-learning/tree/master/micro-oauth2

「其他文章」