使用 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 協議》,轉載必須註明作者和本文連結