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

語言: CN / TW / HK

最近經常有小夥伴問我關於在微服務中使用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;

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版本,下載地址:https://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服務中去,而應該在網關做統一處理,然後通過認證中心去統一認證,這樣才是優雅微服務權限解決方案!

項目源碼地址

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

「其他文章」