精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

別再怕資源泄露!Spring Boot 一站式文件保護方案(簽名鏈接 + 權限 + 限流)

開發 前端
本文將帶你構建一個Spring Boot 一站式文件保護方案,結合簽名 URL(Signed URL)、權限驗證與訪問限流三大核心機制,從根源上保障私有資源的訪問安全。

在如今的數據安全時代,文件存儲與訪問控制早已不再是“上傳+下載”那么簡單。企業應用中常常需要防止文件被未授權訪問、暴力請求或外部盜鏈。 那么問題來了:我們如何讓文件既能被合法訪問,又不會被暴露?

本文將帶你構建一個Spring Boot 一站式文件保護方案,結合簽名 URL(Signed URL)權限驗證訪問限流三大核心機制,從根源上保障私有資源的訪問安全。

方案總覽:簽名 URL + 權限控制 + 限流協同防護

在傳統方案中,文件一旦暴露出直鏈地址,就容易被外部抓取或濫用。 而簽名 URL 的機制能有效解決這個問題。

簽名 URL 的運行流程如下:

  1. 客戶端 請求獲取文件訪問鏈接;
  2. 服務端 校驗權限,通過 HMAC 算法生成帶簽名與過期時間的臨時 URL;
  3. 客戶端 使用簽名 URL 發起下載;
  4. 服務端 驗證簽名與有效期 → 返回文件內容。

優點:

  • 鏈接短期有效,防止盜鏈;
  • 不暴露真實存儲路徑;
  • 可配合權限系統與限流機制,實現“按需安全訪問”。

項目配置與依賴

Maven 依賴

<dependencies>
    <!-- Spring Boot Web 模塊 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <!-- Spring Security 權限控制 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
</dependencies>

應用配置文件

# 文件存儲路徑(Linux 目錄)
file.storage.path=/usr/local/storage/files


# 簽名有效時間(單位:秒)
signed.url.expiration=300


# 簽名密鑰
signed.url.secret=my-super-secret-key

簽名 URL 核心實現

路徑:/src/main/java/com/icoderoad/security/SignedUrlGenerator.java

package com.icoderoad.security;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;


@Component
public class SignedUrlGenerator {


    @Value("${signed.url.expiration}")
    private long expirationTime;


    @Value("${signed.url.secret}")
    private String secretKey;


    // 生成簽名 URL
    public String generateSignedUrl(String filePath) {
        long expires = System.currentTimeMillis() + expirationTime * 1000;
        String data = filePath + "|" + expires;
        String signature = calculateSignature(data, secretKey);


        return "/download?file=" + URLEncoder.encode(filePath, StandardCharsets.UTF_8) +
                "&expires=" + expires +
                "&signature=" + URLEncoder.encode(signature, StandardCharsets.UTF_8);
    }


    // 計算 HMAC-SHA256 簽名
    private String calculateSignature(String data, String key) {
        try {
            Mac hmac = Mac.getInstance("HmacSHA256");
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            hmac.init(keySpec);
            byte[] raw = hmac.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Base64.getUrlEncoder().withoutPadding().encodeToString(raw);
        } catch (Exception e) {
            throw new RuntimeException("簽名計算失敗", e);
        }
    }


    // 簽名驗證邏輯
    public boolean verifySignature(String filePath, long expires, String signature) {
        if (expires < System.currentTimeMillis()) return false;
        String expected = calculateSignature(filePath + "|" + expires, secretKey);
        return secureEquals(expected, signature);
    }


    // 防時序攻擊的安全比較
    private boolean secureEquals(String a, String b) {
        if (a == null || b == null || a.length() != b.length()) return false;
        int result = 0;
        for (int i = 0; i < a.length(); i++) result |= a.charAt(i) ^ b.charAt(i);
        return result == 0;
    }
}

文件訪問控制器

路徑:/src/main/java/com/icoderoad/controller/FileDownloadController.java

package com.icoderoad.controller;


import com.icoderoad.security.SignedUrlGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.*;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;


import java.nio.file.Path;
import java.nio.file.Paths;


@RestController
public class FileDownloadController {


    @Value("${file.storage.path}")
    private String storagePath;


    @Autowired
    private SignedUrlGenerator signedUrlGenerator;


    // 生成帶簽名的訪問 URL
    @GetMapping("/api/signed-url")
    public ResponseEntity<String> generateSignedUrl(@RequestParam String file, Authentication auth) {
        if (!hasAccess(auth, file)) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
        return ResponseEntity.ok(signedUrlGenerator.generateSignedUrl(file));
    }


    // 文件下載接口
    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile(@RequestParam String file,
                                                 @RequestParam long expires,
                                                 @RequestParam String signature) {
        try {
            if (!signedUrlGenerator.verifySignature(file, expires, signature)) {
                return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
            }


            Path filePath = Paths.get(storagePath).resolve(file).normalize();


            // 路徑防越權校驗
            if (!filePath.startsWith(Paths.get(storagePath))) {
                return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
            }


            Resource resource = new UrlResource(filePath.toUri());
            if (resource.exists() && resource.isReadable()) {
                return ResponseEntity.ok()
                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                        .body(resource);
            }
            return ResponseEntity.notFound().build();
        } catch (Exception e) {
            return ResponseEntity.internalServerError().build();
        }
    }


    private boolean hasAccess(Authentication auth, String filePath) {
        // TODO: 實現基于角色或文件歸屬的權限檢查
        return true;
    }
}

安全配置(Spring Security)

路徑:/src/main/java/com/icoderoad/config/SecurityConfig.java

package com.icoderoad.config;


import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/download").permitAll()
                .antMatchers("/api/signed-url").authenticated()
                .and()
            .formLogin()
                .and()
            .csrf().disable();
    }
}

進階擴展

云存儲集成(如 AWS S3、阿里云 OSS、MinIO)

當文件存儲在云端時,可以直接生成云端簽名 URL,無需經過本地服務傳輸。

public String generateS3SignedUrl(String bucket, String objectKey) {
    AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.AP_NORTHEAST_1).build();
    Date expiry = new Date(System.currentTimeMillis() + 5 * 60 * 1000);
    GeneratePresignedUrlRequest request =
            new GeneratePresignedUrlRequest(bucket, objectKey)
                    .withMethod(HttpMethod.GET)
                    .withExpiration(expiry);
    return s3.generatePresignedUrl(request).toString();
}

下載日志記錄與監控

@Component
public class DownloadLogger {
    private static final Logger log = LoggerFactory.getLogger(DownloadLogger.class);


    public void log(String filePath, String user, String ip) {
        log.info("文件下載記錄:file={}, user={}, ip={}", filePath, user, ip);
    }
}

限流保護機制

內存版本(適合單節點部署):

@Component
public class RateLimiter {


    private final Map<String, List<Long>> accessMap = new ConcurrentHashMap<>();
    private static final int MAX_REQUESTS = 10;
    private static final long WINDOW = 60000; // 1分鐘


    public boolean allow(String ip) {
        long now = System.currentTimeMillis();
        List<Long> list = accessMap.getOrDefault(ip, new ArrayList<>());
        list.removeIf(t -> t < now - WINDOW);
        if (list.size() < MAX_REQUESTS) {
            list.add(now);
            accessMap.put(ip, list);
            return true;
        }
        return false;
    }
}

CDN 簽名 URL 配合

簽名參數可與 CDN 回源校驗結合,既安全又節省服務器流量。

短鏈映射優化

通過 Redis 或數據庫映射 /s/abc123 → /download?...,便于分享與審計。

測試示例

@SpringBootTest
public class SignedUrlTest {


    @Autowired
    private SignedUrlGenerator signedUrlGenerator;


    @Test
    public void testSignature() {
        String filePath = "sample.pdf";
        String signedUrl = signedUrlGenerator.generateSignedUrl(filePath);


        Map<String, String> params = parseQueryParams(signedUrl);


        assertTrue(signedUrlGenerator.verifySignature(
                params.get("file"),
                Long.parseLong(params.get("expires")),
                params.get("signature")
        ));
    }


    private Map<String, String> parseQueryParams(String url) {
        return Arrays.stream(url.split("\\?")[1].split("&"))
                .map(s -> s.split("="))
                .collect(Collectors.toMap(a -> a[0], a -> a[1]));
    }
}

總結:安全訪問的多維護盾

通過本文方案,你可以實現:

私有文件保護 —— 防止未授權訪問訪問時效控制 —— 動態簽名自動失效日志審計與限流 —— 阻斷異常流量支持多端存儲與 CDN 集成 —— 靈活部署、彈性擴展

在生產環境中,強烈建議啟用以下安全加固項:

  • 路徑合法性校驗(防止目錄穿越)
  •  常量時間比較(防時序攻擊)
  • Redis 分布式限流(防止刷接口)
  •  CDN 簽名參數(降低帶寬消耗)

有了這套方案,無論文件存儲在本地還是云端,你都能讓“文件訪問”既安全又高效,讓敏感資源不再成為系統的軟肋。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-08-19 09:05:00

Seata分布式事務

2017-05-04 21:30:32

前端異常監控捕獲方案

2013-12-17 18:18:21

2010-05-06 16:02:26

2013-06-14 09:30:52

2013-10-20 13:30:07

華為一站式BYOD敏捷辦公

2013-12-12 15:34:00

Moneta移動支付一站式解決方案

2015-04-19 16:36:10

騰訊云

2015-12-15 17:33:57

戴爾云計算

2024-01-26 08:56:24

PathlibPython操作工具

2022-09-16 11:27:46

建設微服務

2009-10-23 09:42:24

2009-07-30 21:16:29

布線服務電纜架設

2023-10-26 06:59:58

FinOps云原生

2017-11-28 13:53:18

2023-05-26 08:37:04

All in ECPES數據

2015-02-02 11:06:21

cocos cocos一站式解決

2025-01-26 13:27:23

2021-12-07 10:04:34

Azure Kuber場景應用
點贊
收藏

51CTO技術棧公眾號

色天天综合色天天久久| 国产精品一区二区不卡| 中文日韩在线观看| 中文字幕第22页| 黑人极品ⅴideos精品欧美棵| 99久久久精品免费观看国产蜜| 国产脚交av在线一区二区| 日韩va亚洲va欧美va清高| 国内自拍欧美| 欧美性videosxxxxx| av无码久久久久久不卡网站| 成人不用播放器| 国产成人综合在线观看| 国产精品九九久久久久久久| 久久精品久久国产| 91综合久久| 亚洲免费伊人电影在线观看av| 久热精品在线播放| 中文字幕高清在线播放| 亚洲精品少妇30p| 色狠狠久久av五月综合|| 韩国av电影在线观看| 免费一区二区视频| 26uuu日韩精品一区二区| a级黄色片免费看| 西野翔中文久久精品国产| 91精品国产综合久久精品性色| 精品国产免费av| 欧美黄色视屏| 亚洲视频中文字幕| 五月天国产一区| 亚洲欧洲精品视频| 国产suv一区二区三区88区| 国产精品自产拍在线观看| 五月婷婷视频在线| 伊人久久亚洲美女图片| 欧美高清激情视频| 欧美日韩在线观看免费| 天天做天天爱天天综合网2021| 亚洲日韩欧美视频| 新91视频在线观看| 亚州av日韩av| 日韩精品欧美国产精品忘忧草 | 日韩一区二区三区资源| 三级在线播放| 91蜜桃免费观看视频| 国产精品综合久久久久久| 亚洲精品久久久蜜桃动漫| 国产乱码精品一区二区三区忘忧草 | 亚洲天堂电影| 午夜精品国产更新| 久久视频这里有精品| 国产探花视频在线观看| 一区二区三区资源| 日韩午夜三级在线| 国产精品扒开腿做爽爽爽男男| 欧美精品亚洲精品日韩精品| 亚洲精品字幕| 欧美在线影院在线视频| 久久黄色精品视频| 亚洲免费网站| 日韩免费观看av| 色老头一区二区| 免费成人在线网站| 国产综合香蕉五月婷在线| 亚洲一区二区视频在线播放| 免费成人av资源网| 91人成网站www| 午夜老司机福利| 国产a级毛片一区| 国产欧美日韩伦理| 欧美老女人性开放| 欧美高清在线一区| 国产系列第一页| 中文在线免费| 性久久久久久久久久久久| 一二三四视频社区在线| 欧美成人黑人| 欧美人妖巨大在线| 女女调教被c哭捆绑喷水百合| 九九热播视频在线精品6| 日韩精品免费看| 男人天堂资源网| 影视一区二区| 97av在线视频| 中国女人真人一级毛片| 国产一区二区看久久| 国产福利一区二区三区在线观看| 吴梦梦av在线| 国产白浆在线观看| 99精品在线免费| 日本高清久久一区二区三区| 日本天堂在线观看| 亚洲国产精品久久一线不卡| 成人小视频在线看| 精品亚洲二区| 97精品超碰一区二区三区| 久久伊人一区二区| 拍真实国产伦偷精品| 亚洲大型综合色站| 91香蕉视频污版| av不卡一区二区| 永久免费看mv网站入口亚洲| 欧美交换国产一区内射| 视频一区视频二区中文| 亚洲自拍小视频| 国产乱理伦片a级在线观看| 亚洲精品日产精品乱码不卡| www.玖玖玖| 日韩一级淫片| 国产一区二区三区18| 欧美成人精品欧美一级私黄| 久久久亚洲人| 国产99在线免费| 91精品专区| 欧美日韩中文字幕综合视频| 性久久久久久久久久久久久久| 午夜精品福利影院| 欧美精品videosex牲欧美| 做爰视频毛片视频| 91网页版在线| 国产欧美久久久久| www一区二区三区| 亚洲视频自拍偷拍| 综合激情网五月| 成人美女视频在线看| 中文字幕中文字幕99| 三上悠亚亚洲一区| 亚洲国产另类久久精品| 国产精品嫩草影院俄罗斯| 青青草91视频| 欧美精品123| 国产99在线观看| 欧美一二三在线| 亚洲不卡的av| 日韩国产在线一| 久久久影院一区二区三区| 狂野欧美性猛交xxxxx视频| 欧美日韩电影在线播放| 免费视频91蜜桃| 免费永久网站黄欧美| 国产女人水真多18毛片18精品| av香蕉成人| 91精品中文字幕一区二区三区| 欧美aaa级片| 日韩国产欧美在线观看| 欧美精品欧美精品系列c| 蜜桃av在线| 欧美精品一区二区精品网| 国产亚洲欧美久久久久| 国产成人av一区二区| 伊人再见免费在线观看高清版| 警花av一区二区三区| 久久久精品国产一区二区| 国产精品高潮呻吟AV无码| 国产精品高潮久久久久无| 亚洲欧美久久久久| 天天综合一区| 91文字幕巨乱亚洲香蕉| 操喷在线视频| 精品网站999www| 成年人av网站| 国产精品传媒视频| 久久6免费视频| 午夜天堂精品久久久久| 国产精品传媒毛片三区| segui88久久综合9999| 日韩欧美视频在线播放| 另类专区欧美制服同性| www.日本在线观看| 午夜欧美在线一二页| 中文字幕第4页| 另类小说一区二区三区| 手机在线视频你懂的| 亚洲成人影音| 欧美在线一级视频| 免费大片黄在线| 日韩欧美不卡一区| 影音先锋亚洲天堂| 国产欧美综合在线观看第十页| 一女二男3p波多野结衣| 欧美激情综合| 免费h精品视频在线播放| 成人在线视频观看| 欧美精品videos| 国产污视频在线| 欧美一区二区三区视频免费播放 | 日本久久久久久| 91高清在线视频| 日韩欧美在线网站| 欧美一级特黄视频| 亚洲欧美色图小说| 久久国产精品影院| 韩国成人精品a∨在线观看| 欧美一级欧美一级| 欧美激情理论| 精品国产综合久久| 日本中文字幕视频一区| 97热精品视频官网| 欧美日韩xx| 日韩av在线高清| 国产免费不卡av| 一本大道久久a久久综合婷婷 | 亚洲777理论| 国产黄色录像视频| 99久久99久久精品免费看蜜桃 | 日韩午夜电影免费看| 九九九久久久久久| jzzjzzjzz亚洲成熟少妇| 精品国产sm最大网站| 中文字幕一级片| 五月激情综合网| 九九热国产精品视频| 中文字幕乱码日本亚洲一区二区| 日韩精品人妻中文字幕有码 | av网站在线免费观看| 亚洲电影免费观看高清完整版在线观看| 成人黄色三级视频| 欧美日韩激情小视频| 日本青青草视频| 国产精品欧美极品| 日本高清www| 成人久久视频在线观看| 伊人免费视频二| 男人的j进女人的j一区| 亚洲人成色77777| 日韩视频一区二区三区在线播放免费观看| 99re99热| 五月综合激情| 亚洲精品久久久久久一区二区| 日韩欧美黄色| 精品国产乱码久久久久久蜜柚| 一区二区在线免费播放| 91视频免费进入| 亚洲精品乱码日韩| 国产精品你懂得| 欧美国产日韩电影| 国产成人高潮免费观看精品| 亚洲插插视频| 8050国产精品久久久久久| 96av在线| 欧美在线精品免播放器视频| 日韩精品美女| 91av在线影院| 小h片在线观看| 欧美怡红院视频一区二区三区| 日韩精品av| 青青草一区二区| 伊人久久精品一区二区三区| 2019亚洲日韩新视频| 中文在线资源| 国产成一区二区| 国产精品黄色片| 成人久久一区二区| 日韩国产在线不卡视频| 99se婷婷在线视频观看| 9999久久久久| 精品视频导航| 欧美极品中文字幕| 亚洲一区三区| 在线观看日韩| 无码人妻少妇伦在线电影| 亚洲国产美女| 日韩久久一级片| 欧美aaaaaa午夜精品| 天堂在线中文在线| 国产精品一区不卡| 久久精品女同亚洲女同13| 91麻豆免费在线观看| 欧美人妻一区二区三区| 国产精品视频一二| 久热这里有精品| 亚洲成人av电影| 欧美a视频在线观看| 欧美日韩国产天堂| 性生活黄色大片| 亚洲女同精品视频| 日本韩国在线视频爽| 色综合导航网站| 精品国产第一福利网站| 国产日韩精品在线播放| 超碰成人97| 婷婷久久伊人| 亚洲二区视频| 男女啪啪网站视频| 国产成人啪免费观看软件| 3d动漫精品啪啪一区二区下载| 中文字幕一区二区视频| 日本一区二区三区四区五区| 欧美亚洲图片小说| 亚洲欧美激情国产综合久久久| 亚洲欧美激情视频| 99久久精品免费观看国产| 日本久久精品视频| 一区二区免费| 视频在线99| 亚洲韩日在线| 国产成年人视频网站| 99re6这里只有精品视频在线观看| 在线看片中文字幕| 欧美日韩国产色视频| 国产精品高潮呻吟av| 亚洲美女av在线播放| a在线免费观看| 国产成人精品网站| 猫咪成人在线观看| 亚洲精品偷拍视频| 日本女人一区二区三区| 朝桐光av一区二区三区| 亚洲人午夜精品天堂一二香蕉| 亚洲欧美偷拍视频| 精品国产sm最大网站免费看 | 国产最新精品视频| 91嫩草国产线观看亚洲一区二区| 久久资源亚洲| 亚洲精品社区| 色男人天堂av| 国产精品卡一卡二| 91久久国产综合久久91| 精品sm在线观看| mm1313亚洲国产精品美女| 国产精品福利观看| 蜜桃a∨噜噜一区二区三区| 国产成人永久免费视频| 精油按摩中文字幕久久| www色com| 91国内精品野花午夜精品| 亚洲人午夜射精精品日韩| 久久久久久久国产精品视频| 欧美在线在线| 777久久精品一区二区三区无码| 蜜桃一区二区三区四区| 国产又粗又猛又爽又黄av| 狠狠躁18三区二区一区| 天天操天天干天天操| 久久久久久国产精品| 日韩一区二区三区精品视频第3页| 一区二区三区日韩视频| 久久精品国产秦先生| 蜜桃av免费观看| 精品污污网站免费看| 69久久久久| 成人欧美一区二区三区黑人| 欧美电影一二区| 日本免费色视频| 亚洲人成伊人成综合网小说| 国产99久久九九精品无码免费| 成人444kkkk在线观看| 国产精品久久久久久久久久辛辛 | 日韩你懂的电影在线观看| 亚洲男同gay网站| av色综合网| 激情欧美日韩| 黄色工厂在线观看| 成人av在线播放网站| 美女视频黄免费| 亚洲黄一区二区| 国产精品一区二区av影院萌芽| 日本亚洲自拍| 久久国内精品视频| 麻豆明星ai换脸视频| 日韩欧美你懂的| 91色在线看| 欧美高清性xxxxhd| 日韩二区三区四区| 91ts人妖另类精品系列| 欧美一区二区美女| 久草免费在线视频| 色综合久久av| 国产在线精品不卡| 国产一级做a爰片在线看免费| 亚洲精品国精品久久99热一| 欧美动物xxx| 中国人体摄影一区二区三区| 国产成人综合亚洲网站| 特级西西444www大精品视频免费看| 亚洲视频欧洲视频| 电影中文字幕一区二区| 九九爱精品视频| 国产精品午夜在线| 亚洲av无码国产精品永久一区| 2021国产精品视频| 欧美色女视频| 日本成人在线免费| 一本久久综合亚洲鲁鲁五月天| 欧美激情午夜| 国产一区二区三区四区五区在线| 日韩专区欧美专区| 看片网站在线观看| 亚洲视频一区二区| 日韩精品一区二区三区中文在线| 青青草原成人网| 国产精品国产三级国产aⅴ原创| 蜜臀久久精品久久久久| 国产精品免费视频xxxx| 亚洲青涩在线| 顶臀精品视频www| 亚洲亚裔videos黑人hd| 亚洲专区**| 午夜久久久精品|