精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久草.com| 中文字幕亚洲精品| 阿v天堂2017| 五月婷婷丁香花| 久久精品九九| 久久精品国产成人| 最新在线黄色网址| 国产精品高潮久久| 亚洲成人免费电影| 日本在线免费观看一区| 午夜精品一二三区| 日韩国产欧美在线播放| 欧美高清第一页| 欧美18—19性高清hd4k| 久久久精品区| 91福利社在线观看| 国产在线视频综合| 国产高清免费在线播放| 国产成人一级电影| 国产精品久久久精品| 青青草原免费观看| 青青草国产成人a∨下载安卓| 日韩欧美在线1卡| 日本va中文字幕| 91桃色在线| 中文字幕一区二区三区在线播放| 久久精品美女| www.国产麻豆| 久热成人在线视频| 欧美重口另类videos人妖| 天天看片中文字幕| 久久中文字幕av| 亚洲精品资源美女情侣酒店| 免费观看一区二区三区| 日韩久久99| 性欧美freehd18| 精品系列免费在线观看| 欧美综合在线第二页| 青青草偷拍视频| 欧美丰满老妇| 中文字幕无线精品亚洲乱码一区 | 成人午夜在线免费| 成人午夜在线观看| 日韩乱码一区二区三区| 欧美亚洲一区| 91av在线播放视频| 欧美一级高潮片| 欧美日韩成人| 欧美情侣性视频| 印度午夜性春猛xxx交| 97精品国产一区二区三区 | 久久黄色美女电影| 欧美激情一区三区| 视频一区视频二区视频| 国产三级电影在线观看| 久久久久久久久久久黄色| 麻豆传媒一区二区| 免费a在线观看| 久久久久青草大香线综合精品| 国产一区二区三区四区五区加勒比| 99热这里只有精品5| 国产精品一区二区三区乱码| 亚洲综合色av| 欧美 日韩 综合| 不卡的av网站| 久久精品人成| 91精品国产综合久久久久久豆腐| 欧美国产日产图区| 亚洲春色在线视频| 日本高清在线观看wwwww色| 国产精品福利影院| av动漫免费观看| √天堂8在线网| 亚洲在线视频一区| 久久久一本二本三本| 黑人巨大亚洲一区二区久| 一本大道av伊人久久综合| 激情五月婷婷久久| 亚洲18在线| 欧美va亚洲va在线观看蝴蝶网| 久久久男人的天堂| 牛牛影视久久网| 亚洲视频777| 天美传媒免费在线观看| 欧美国产综合| 欧美在线视频一二三| 亚洲视屏在线观看| 国产在线精品一区二区三区不卡| www.成人三级视频| 三级在线观看| 成人欧美一区二区三区黑人麻豆| 男女爱爱视频网站| 日本在线高清| 欧美日韩国产精选| 国产人成视频在线观看| 精品国产乱码久久久久久1区2匹| www.午夜精品| 日本熟女一区二区| 蜜臀久久久久久久| 电影午夜精品一区二区三区| 欧美91精品久久久久国产性生爱| 国产精品国产三级国产aⅴ无密码| 成年在线观看视频| 国产私拍福利精品视频二区| 欧美一级精品大片| 九九热免费在线| 激情欧美日韩| 成人伊人精品色xxxx视频| 五月婷婷在线播放| 一区在线观看免费| 日本久久久精品视频| 精品国产乱码一区二区三区| 精品香蕉在线观看视频一| 激情五月婷婷小说| 免播放器亚洲一区| 久久免费看av| 高h视频在线播放| 欧美午夜一区二区| 三级黄色片网站| 欧美激情第10页| 国产精品视频公开费视频| 午夜成人免费影院| 一区二区理论电影在线观看| 欧美日韩怡红院| 精品丝袜久久| 精品少妇v888av| ,一级淫片a看免费| 国产欧美日韩精品在线| 欧美变态另类刺激| 成人午夜大片| 欧美丰满少妇xxxxx做受| 中文字幕网址在线| 国产偷国产偷精品高清尤物| 国产69精品久久久久久久| 久久久久久久久成人| 久久久精品国产一区二区| 亚洲天堂五月天| 91麻豆蜜桃一区二区三区| 欧美人成在线观看| 婷婷视频一区二区三区| 久久九九精品99国产精品| 中文字幕在线观看第二页| 久久久久久久久蜜桃| 情侣黄网站免费看| 伊人久久大香线蕉| 青草成人免费视频| 日本在线丨区| 欧美日韩精品国产| 久久久无码人妻精品一区| 国产欧美日韩一区二区三区在线| 国产伦精品一区二区三区视频黑人| 精品精品导航| 亚洲精品一区二区三区四区高清 | 欧美日韩激情小视频| 国产xxxxxxxxx| 国产日韩1区| 激情视频一区二区| 在线观看的黄色| 亚洲欧美中文另类| 九九热最新视频| 国产精品麻豆视频| 亚洲综合婷婷久久| 小小影院久久| 91九色在线免费视频| 激情图片在线观看高清国产| 亚洲精品一区在线观看| 91精品国产综合久久久蜜臀九色| 91蜜桃免费观看视频| 日本三区在线观看| 日韩1区在线| 91亚洲精品久久久| 免费影视亚洲| 亚洲精品日韩久久久| 国产美女www| 亚洲欧洲精品成人久久奇米网| 亚洲五月激情网| 亚洲成人中文| 日本一区二区精品| aa亚洲一区一区三区| 欧美日本黄视频| 色综合成人av| 欧美喷潮久久久xxxxx| 国产成人无码aa精品一区| 97se亚洲国产综合在线| caoporn超碰97| 欧美在线91| 欧美极品色图| 国产精品欧美一区二区三区不卡| 欧美极品少妇与黑人| 国产综合视频一区二区三区免费| 欧美老女人在线| 精品国产免费观看| 1区2区3区国产精品| 欧美深性狂猛ⅹxxx深喉| 另类的小说在线视频另类成人小视频在线 | 蜜臀av中文字幕| 91福利视频久久久久| 麻豆一区产品精品蜜桃的特点 | 麻豆精品视频在线观看视频| 久久综合久久久久| 欧美日中文字幕| 国外成人免费视频| 亚洲欧美专区| 欧美专区国产专区| 成年视频在线观看| 亚洲人成网站999久久久综合| 99久久久久久久| 色欧美88888久久久久久影院| 放荡的美妇在线播放| 国产婷婷一区二区| 久久免费精品国产| 久久99热这里只有精品| 黄色www网站| 女生裸体视频一区二区三区| 日韩精品欧美专区| 黄色成人美女网站| 成人淫片在线看| 欧美日韩精品免费观看视完整| 欧美国产高跟鞋裸体秀xxxhd| porn视频在线观看| 国产手机视频精品| 成人久久精品人妻一区二区三区| 欧美另类一区二区三区| www.欧美色| 欧美午夜美女看片| 日韩精品视频免费播放| 亚洲激情图片小说视频| 麻豆一区在线观看| 国产日产欧美一区二区三区| 免费中文字幕av| 国产精品一区二区免费不卡| 国产精品区在线| 日本欧美在线观看| 国产麻花豆剧传媒精品mv在线| 91久久黄色| 国产视频在线观看网站| 亚洲综合专区| 中文字幕乱码一区二区三区 | 日韩中文字幕av| 毛片在线播放网址| 亚洲天堂免费在线| 免费国产在线视频| 亚洲欧美三级伦理| 男人久久精品| 亚洲人成在线观看| 久草福利在线| 国产亚洲视频在线观看| 99riav在线| 久久久精品在线| 超碰在线无需免费| 九九热精品视频国产| 污污在线观看| 欧美激情视频一区二区| 激情av在线播放| 2019亚洲男人天堂| 国产精欧美一区二区三区蓝颜男同| 欧美在线视频观看| 你懂得影院夜精品a| 国产精品久久久一区| 欧美v亚洲v综合v国产v仙踪林| 国产精品中文字幕在线| 日韩专区视频网站| 97超级碰碰| 大伊香蕉精品在线品播放| 精品在线不卡| jiujiure精品视频播放| 亚洲日本欧美在线| 久久精品av| 日本一级黄视频| 99re国产精品| www.天天射.com| 久久精品国产**网站演员| 91国内在线播放| 成人免费高清视频在线观看| 成人精品在线观看视频| 国产清纯美女被跳蛋高潮一区二区久久w | 国产最新精品视频| 毛片无码国产| 国产一区二区色| xxxx日韩| 日本午夜精品电影| 一区二区不卡| 成人综合视频在线| 免费xxxx性欧美18vr| 午夜福利三级理论电影| 久久综合狠狠综合久久综合88 | 亚洲国产aⅴ天堂久久| 久久久久久久久久久久久av| 色狠狠色噜噜噜综合网| 国产免费的av| 亚洲深夜影院| 久久成年人免费电影| 在线中文字幕视频观看| 久久久噜噜噜久久久| 中文字幕在线直播| 国产美女久久精品| 99国产精品久久一区二区三区| 欧美精品一区三区在线观看| 小处雏高清一区二区三区| 欧美精品卡一卡二| 久久国产精品99精品国产| 亚洲精品乱码久久久久久蜜桃欧美| 久久色视频免费观看| 日日噜噜夜夜狠狠久久波多野| 午夜欧美大尺度福利影院在线看 | av免费在线一区二区三区| 欧美大片在线看免费观看| 精品欧美日韩精品| 国产精品v欧美精品v日韩| sdde在线播放一区二区| 黄色大片在线免费看| 麻豆精品久久精品色综合| 香港三日本8a三级少妇三级99| 成人欧美一区二区三区视频网页| √资源天堂中文在线| 亚洲精品在线免费观看视频| 男人资源在线播放| 日韩av123| 风间由美中文字幕在线看视频国产欧美 | 国产理论片在线观看| 亚洲欧美日韩国产中文| 成人在线高清免费| 亚洲a级在线播放观看| 成人免费av| 97超碰青青草| 国产91丝袜在线播放| 天海翼在线视频| 欧美性大战久久久| 深夜福利视频一区| 欧美劲爆第一页| 91蝌蚪精品视频| 欧美一区二区三区综合| 国产精品一区专区| www.av成人| 欧美美女网站色| 日韩黄色影院| 国产精品视频xxx| 日韩久久精品网| 91在线视频观看免费| 国产欧美一区二区三区网站| 亚洲日本视频在线观看| 亚洲精品99久久久久中文字幕| 变态调教一区二区三区| 国产精品一区二区免费看| 欧美精品网站| av在线天堂网| 亚洲成年人影院| 偷拍自拍在线| 5566日本婷婷色中文字幕97| 女人抽搐喷水高潮国产精品| www黄色日本| 久久一区二区三区四区| 黄瓜视频在线免费观看| 亚洲欧美在线免费| 欧美黄色三级| 亚洲aⅴ天堂av在线电影软件| 日韩不卡一区二区| 日本猛少妇色xxxxx免费网站| 精品视频1区2区| 国产在线69| 91精品国产一区二区三区动漫| 欧美日韩免费| 人妻在线日韩免费视频| 色妹子一区二区| 婷婷视频在线| 999日本视频| 日韩亚洲国产欧美| 亚洲最大成人网站| 欧美日韩中文一区| www在线视频| 国产三级精品在线不卡| 久久精品五月| 三级黄色免费观看| 精品日韩99亚洲| 波多野结衣久久精品| 亚洲草草视频| 国产高清不卡一区二区| 久久久久久久久久久久久久av| 亚洲视频精品在线| 精品视频成人| 高清在线观看免费| 国产精品久久久久久久久免费相片 | 图片区小说区区亚洲五月| 国产一区二区看久久| 久久久久久久99| 中文字幕日韩综合av| 999在线精品| 亚洲人成无码www久久久| 亚洲欧洲色图综合| 天堂在线观看视频| 国产一区二中文字幕在线看| 亚洲高清毛片| 网站永久看片免费| 亚洲黄色在线观看| 日韩一级特黄| 日本在线观看a| 亚洲精品视频在线看| 激情在线视频| 国产精品一区二区三区四区五区| 日本aⅴ精品一区二区三区|