SpringCloud-OAuth2(三):進階篇

竹根七發表於2021-06-25
上篇文章講了SpringCloud OAuth 的實戰篇,但是在微服務環境下,常常會有一個認證中心。
而普通服務接收到請求後,判斷token是否有效並不是自己處理的,因為token的管理統一交給認證中心,token也理應被認證中心統一管理(職責專一性)。

那麼這篇文章會介紹如何搭建認證中心,並介紹普通服務是如何處理token的。

1:認證中心的搭建(OAuth Center)

1.1:回顧

先看下上篇文章:SpringCloud-OAuth2(二):實戰篇
上篇文章其實就已經簡單搭建好了一個認證中心,因為我寫了一個認證中心的配置。
可以看上文的這部分地方↓↓↓↓↓↓↓↓↓

drawing

1.2:我的專案結構圖

drawing

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

drawing

3.2:攜帶token訪問其他服務的介面

drawing

3.3:uml圖

drawing

認證中心頒發token、對token鑑權,攜帶token訪問其他服務的介面,這是個閉環,合情合理。

4:再聊聊認證中心

每個普通服務一定要配置認證中心的的相關配置嗎?答案是否定的。


先看看下面這張圖:
drawing

當一個請求通過閘道器的轉發之後,其他服務之間還需要通訊,當請求到達訂單服務,還會通過使用者服務、支付服務。
在業務比較複雜的情況下,呼叫鏈有可能會更加複雜。
而每個服務都要去認證中心鑑定一下token是否合法,假設每鑑定一次token的耗時為50ms,那麼呼叫鏈越長耗時更長。

總結:強校驗、高耗時。

這種設計幾乎是難以容忍等待,那麼是否可以更好管理token和資源呢?


再看看這張圖:
drawing

前面就說過了,認證中心除了管理token,理應也具備管理許可權、資源的功能,因為伺服器之間的呼叫鏈可能會非常複雜,
如果每個服務在處理請求之前,都需要去認證中心找一下token是否有效,完全是浪費資源的。
而微服務之間的通訊基本是基於內網的,不可能每個服務都暴露在外網,因此我們只需要在統一的入口:閘道器層 做token、許可權資源的校驗即可。
這種做法既保證了系統的安全性,也降低了在許可權校驗上的時間成本。

總結:一次校驗、暢通無阻。

相關文章