SpringCloud 實戰:禁止直接訪問後端服務

www88jmpcom17176934555發表於2021-03-29

使用 SpringCloud 架構後,我們希望所有的請求都需要經過閘道器才能訪問。在不作任何處理的情況下,我們是可以繞過閘道器直接訪問後端服務的。如下,我們繞過閘道器直接訪問後端服務也是可以獲取到資料的。

圖片

那我們今天的議題就是如何防止請求繞過閘道器直接訪問後端服務?

圖片

解決方案

我覺得防止繞過閘道器直接請求後端服務的解決方案主要有三種:

  • 使用 Kubernetes 部署

    在使用 Kubernetes 部署 SpringCloud 架構時,我們給閘道器的 Service 配置 NodePort,其他後端服務的 Service 使用 ClusterIp,這樣在叢集外就只能訪問到閘道器了。

  • 網路隔離

    後端普通服務都部署在內網,通過防火牆策略限制只允許閘道器應用訪問後端服務。

  • 應用層攔截

    請求後端服務時通過攔截器校驗請求是否來自閘道器,如果不來自閘道器則提示不允許訪問。

這裡我們著重關注在應用層攔截這種解決方案。

圖片

實現

實現思路

實現思路其實也很簡單,在請求經過閘道器的時候給請求頭中增加一個額外的 Header,在後端服務中寫一個攔截器,判斷請求頭是否與在閘道器設定的請求 Header 一致,如果不一致則不允許訪問並給出提示。

當然為了防止在每個後端服務都需要編寫這個攔截器,我們可以將其寫在一個公共的 starter 中,讓後端服務引用即可。而且為了靈活,可以通過配置決定是否只允許後端服務訪問。

接下來我們看看核心程式碼。

實現過程

在閘道器 cloud-gateway 模組編寫閘道器過濾器

@Component

在請求經過閘道器時新增額外的 Header,為了方便這裡直接設定成固定值。

建立公共 Starter 模組 cloud-component-security-starter

編寫配置類,用於靈活控制服務是否允許繞過閘道器

@Data

編寫攔截器,用於校驗請求是否經過閘道器

public class ServerProtectInterceptor implements HandlerInterceptor {

配置攔截器

public class CloudSecurityInterceptorConfigure implements WebMvcConfigurer {

編寫 starter 裝載類

@EnableConfigurationProperties(CloudSecurityProperties.class)

建立資原始檔 spring.factories,配置 Bean 的自動載入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\`` com.javadaily.component.security.configure.CloudSecurityAutoConfigure

在後端服務配置檔案中新增屬性配置,預設只能通過閘道器訪問

javadaily:

經過以上幾步,一個公共的 Starter 模組就構建完成了。

後端服務引用此公共 Starter 模組即可,以 account-service 為例

<dependency>

實現效果

直接訪問後端服務介面
localhost:8010/account/getByCode/ji...

圖片

返回結果:

{

以上,希望對你有所幫助!
轉載網路

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章