上篇文章講了SpringCloud OAuth 的實戰篇,但是在微服務環境下,常常會有一個認證中心。
而普通服務接收到請求後,判斷token是否有效並不是自己處理的,因為token的管理統一交給認證中心,token也理應被認證中心統一管理(職責專一性)。
那麼這篇文章會介紹如何搭建認證中心,並介紹普通服務是如何處理token的。
1:認證中心的搭建(OAuth Center)
1.1:回顧
先看下上篇文章:SpringCloud-OAuth2(二):實戰篇
上篇文章其實就已經簡單搭建好了一個認證中心,因為我寫了一個認證中心的配置。
可以看上文的這部分地方↓↓↓↓↓↓↓↓↓
1.2:我的專案結構圖
wfw-auth-center:認證中心
wfw-auth-client:認證客戶端
wfw-auth-common:common包
2:認證客戶端的配置
只需要做兩件事:properties配置、資源服務配置
關於pom:用上篇的或者參考我的github。
為什麼需要些資源服務配置?
因為客戶端本身是一個服務,需要管理自己資源。但是我們可以將資源交給中心統一管理,這個後面會細說。
2.1:application配置
#認證中心地址
auth.server.address=127.0.0.1:8123
#認證客戶端校驗token的配置
security.oauth2.client.client-id=admin
security.oauth2.client.client-secret=admin
security.oauth2.client.access-token-uri=http://${auth.server.address}/oauth/token
security.oauth2.resource.jwt.key-uri=http://${auth.server.address}/oauth/token_key
security.oauth2.client.grant-type=password
security.oauth2.client.scope=all
2.2:資源服務配置
參考認證中心的配置做一定的更改即可。
@Configuration
@EnableResourceServer
public class WebClientResourceConfig extends ResourceServerConfigurerAdapter {
private final AuthClientExceptionHandler authClientExceptionHandler;
public WebClientResourceConfig(AuthClientExceptionHandler authClientExceptionHandler) {
this.authClientExceptionHandler = authClientExceptionHandler;
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId("admin").stateless(true).authenticationEntryPoint(authClientExceptionHandler);
}
@Override
public void configure(HttpSecurity http) throws Exception {
// 資源鏈路
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
// 登入放通
.and()
.authorizeRequests()
.antMatchers("/oauth/**")
.permitAll()
// 其他請求都需認證
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
// 跨域
.and()
.cors()
// 關閉跨站請求防護
.and()
.csrf()
.disable();
}
}
3:測試
3.1:先獲取token
3.2:攜帶token訪問其他服務的介面
3.3:uml圖
認證中心頒發token、對token鑑權,攜帶token訪問其他服務的介面,這是個閉環,合情合理。
4:再聊聊認證中心
每個普通服務一定要配置認證中心的的相關配置嗎?答案是否定的。
先看看下面這張圖:
當一個請求通過閘道器的轉發之後,其他服務之間還需要通訊,當請求到達訂單服務,還會通過使用者服務、支付服務。
在業務比較複雜的情況下,呼叫鏈有可能會更加複雜。
而每個服務都要去認證中心鑑定一下token是否合法,假設每鑑定一次token的耗時為50ms,那麼呼叫鏈越長耗時更長。
總結:強校驗、高耗時。
這種設計幾乎是難以容忍等待,那麼是否可以更好管理token和資源呢?
再看看這張圖:
前面就說過了,認證中心除了管理token,理應也具備管理許可權、資源的功能,因為伺服器之間的呼叫鏈可能會非常複雜,
如果每個服務在處理請求之前,都需要去認證中心找一下token是否有效,完全是浪費資源的。
而微服務之間的通訊基本是基於內網的,不可能每個服務都暴露在外網,因此我們只需要在統一的入口:閘道器層 做token、許可權資源的校驗即可。
這種做法既保證了系統的安全性,也降低了在許可權校驗上的時間成本。
總結:一次校驗、暢通無阻。