欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud?中防止繞過網(wǎng)關(guān)請求直接訪問后端服務(wù)的解決方法

 更新時(shí)間:2023年06月21日 15:29:26   作者:JAVA日知錄  
這篇文章主要介紹了SpringCloud中如何防止繞過網(wǎng)關(guān)請求直接訪問后端服務(wù),本文給大家分享三種解決方案,需要的朋友可以參考下

SpringCloud 中如何防止繞過網(wǎng)關(guān)請求后端服務(wù)?感興趣的一起探討探討唄!

前言

使用SpringCloud架構(gòu)后我們希望所有的請求都需要經(jīng)過網(wǎng)關(guān)才能訪問,在不作任何處理的情況下我們是可以繞過網(wǎng)關(guān)直接訪問后端服務(wù)的。如下,我們繞過網(wǎng)關(guān)直接訪問后端服務(wù)也是可以獲取到數(shù)據(jù)的。

那我們今天的議題就是 如何防止請求繞過網(wǎng)關(guān)直接訪問后端服務(wù)?

解決方案

我覺得防止繞過網(wǎng)關(guān)直接請求后端服務(wù)的解決方案主要有三種:

  • 使用Kubernetes部署

在使用Kubernetes部署SpringCloud架構(gòu)時(shí)我們給網(wǎng)關(guān)的Service配置NodePort,其他后端服務(wù)的Service使用ClusterIp,這樣在集群外就只能訪問到網(wǎng)關(guān)了。

  • 網(wǎng)絡(luò)隔離

后端普通服務(wù)都部署在內(nèi)網(wǎng),通過防火墻策略限制只允許網(wǎng)關(guān)應(yīng)用訪問后端服務(wù)。

  • 應(yīng)用層攔截

請求后端服務(wù)時(shí)通過攔截器校驗(yàn)請求是否來自網(wǎng)關(guān),如果不來自網(wǎng)關(guān)則提示不允許訪問。

這里我們著重關(guān)注在應(yīng)用層攔截這種解決方案。

實(shí)現(xiàn)思路

實(shí)現(xiàn)思路其實(shí)也很簡單,在請求經(jīng)過網(wǎng)關(guān)的時(shí)候給請求頭中增加一個(gè)額外的Header,在后端服務(wù)中寫一個(gè)攔截器,判斷請求頭是否與在網(wǎng)關(guān)設(shè)置的請求Header一致,如果不一致則不允許訪問并給出提示。

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

接下來我們看看核心代碼。(代碼中涉及 SpringBoot 編寫公共Starter的套路,相信看過我博客的同學(xué)肯定是會(huì)的,因?yàn)橹拔恼掠性敿?xì)說過。)

實(shí)現(xiàn)過程

在網(wǎng)關(guān)cloud-gateway模塊編寫網(wǎng)關(guān)過濾器

@Component
@Order(0)
public class GatewayRequestFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        byte[] token = Base64Utils.encode((CloudConstant.GATEWAY_TOKEN_VALUE).getBytes());
        String[] headerValues = {new String(token)};
        ServerHttpRequest build = exchange.getRequest()
                .mutate()
                .header(CloudConstant.GATEWAY_TOKEN_HEADER, headerValues)
                .build();
        ServerWebExchange newExchange = exchange.mutate().request(build).build();
        return chain.filter(newExchange);
    }
}

在請求經(jīng)過網(wǎng)關(guān)時(shí)添加額外的Header,為了方便這里直接設(shè)置成固定值。

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

編寫配置類,用于靈活控制服務(wù)是否允許繞過網(wǎng)關(guān)

@Data
@ConfigurationProperties(prefix = "javadaily.cloud")
public class CloudSecurityProperties {
    /**
     * 是否只能通過網(wǎng)關(guān)獲取資源
     * 默認(rèn)為True
     */
    private Boolean onlyFetchByGateway = Boolean.TRUE;
}

編寫攔截器,用于校驗(yàn)請求是否經(jīng)過網(wǎng)關(guān)

public class ServerProtectInterceptor implements HandlerInterceptor {
    private CloudSecurityProperties properties;
    @Override
    public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler){
        if (!properties.getOnlyFetchByGateway()) {
            return true;
        }
        String token = request.getHeader(CloudConstant.GATEWAY_TOKEN_HEADER);
        String gatewayToken = new String(Base64Utils.encode(CloudConstant.GATEWAY_TOKEN_VALUE.getBytes()));
        if (StringUtils.equals(gatewayToken, token)) {
            return true;
        } else {
            ResultData<String> resultData = new ResultData<>();
            resultData.setSuccess(false);
            resultData.setStatus(HttpServletResponse.SC_FORBIDDEN);
            resultData.setMessage("請通過網(wǎng)關(guān)訪問資源");
            WebUtils.writeJson(response,resultData);
            return false;
        }
    }
    public void setProperties(CloudSecurityProperties properties) {
        this.properties = properties;
    }
}

配置攔截器

public class CloudSecurityInterceptorConfigure implements WebMvcConfigurer {
    private CloudSecurityProperties properties;
    @Autowired
    public void setProperties(CloudSecurityProperties properties) {
        this.properties = properties;
    }
    @Bean
    public HandlerInterceptor serverProtectInterceptor() {
        ServerProtectInterceptor interceptor = new ServerProtectInterceptor();
        interceptor.setProperties(properties);
        return interceptor;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(serverProtectInterceptor());
    }
}

編寫stater裝載類

@EnableConfigurationProperties(CloudSecurityProperties.class)
public class CloudSecurityAutoConfigure{
    @Bean
    public CloudSecurityInterceptorConfigure cloudSecurityInterceptorConfigure() {
        return new CloudSecurityInterceptorConfigure();
    }
}

建立資源文件spring.factories,配置Bean的自動(dòng)加載

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

在后端服務(wù)配置文件中添加屬性配置,默認(rèn)只能通過網(wǎng)關(guān)訪問

javadaily:
  cloud:
    onlyFetchByGateway: true

經(jīng)過以上幾步,一個(gè)公共的Starter模塊就構(gòu)建完成了。

后端服務(wù)引用此公共Starter模塊即可,以account-service為例

<dependency>
	<groupId>com.jianzh5.cloud</groupId>
	<artifactId>cloud-component-security-starter</artifactId>
</dependency>

實(shí)現(xiàn)效果

直接訪問后端服務(wù)接口 http://localhost:8010/account/getByCode/jianzh5

返回結(jié)果:

{
  "message": "請通過網(wǎng)關(guān)訪問資源",
  "status": 403,
  "success": false,
  "timestamp": 1611660015830
}

到此這篇關(guān)于SpringCloud 中如何防止繞過網(wǎng)關(guān)請求后端服務(wù)的文章就介紹到這了,更多相關(guān)SpringCloud 網(wǎng)關(guān)請求后端服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺拷貝和深拷貝原理分析

    淺拷貝和深拷貝原理分析

    Java 對象拷貝是為對象賦值的一種方式,簡單來說就是創(chuàng)建一個(gè)和原對象相同的對象,新創(chuàng)建的對象是原對象的一個(gè)副本。面試官賊拉喜歡在面試的時(shí)候問一問你淺拷貝和深拷貝的原理
    2021-08-08
  • Intellij idea熱部署插件JRebel的使用

    Intellij idea熱部署插件JRebel的使用

    這篇文章主要介紹了Intellij idea熱部署插件JRebel的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn)

    springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn)

    本文主要介紹了springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開發(fā)環(huán)境和測試環(huán)境

    SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開發(fā)環(huán)境和測試環(huán)境

    這篇文章主要介紹了SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開發(fā)環(huán)境和測試環(huán)境,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JDK源碼之Vector與HashSet解析

    JDK源碼之Vector與HashSet解析

    HashSet、HashMap、ArrayList、LinkedList、Vector這幾個(gè)在Java編程中經(jīng)常用到,他們之間有很多聯(lián)系,有很多相通的地方,我們這次先了解一下Vector與HashSet
    2021-06-06
  • SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問題

    SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問題

    這篇文章主要介紹了SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java中類和對象的詳細(xì)介紹

    java中類和對象的詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于java中類和對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 詳解Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字)

    詳解Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字)

    這篇文章主要介紹了Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 關(guān)于Gateway路由匹配規(guī)則解讀

    關(guān)于Gateway路由匹配規(guī)則解讀

    本文詳細(xì)介紹了SpringCloudGateway的路由匹配規(guī)則,包括基本概念、常用屬性、實(shí)際應(yīng)用以及注意事項(xiàng),路由匹配規(guī)則決定了請求如何被轉(zhuǎn)發(fā)到目標(biāo)服務(wù),是Gateway的核心功能之一,在配置路由時(shí)需要注意順序、性能和安全性
    2025-02-02
  • 分析JAVA中幾種常用的RPC框架

    分析JAVA中幾種常用的RPC框架

    這篇文章主要介紹了JAVA中幾種常用的RPC框架的相關(guān)知識點(diǎn),對此有興趣的朋友參考學(xué)習(xí)下吧。
    2018-03-03

最新評論