You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多角色文件下载权限安全加固需求

Laravel 文件下载权限加固方案

问题核心

当前下载功能未校验用户与文件的关联权限,仅通过路由中间件限制角色,但用户可通过修改URL中的fileId直接下载不属于自己的文件。


修复步骤

1. 确保模型关联正确

首先确认File和User模型已通过download中间表建立多对多关联:

File.php 模型

public function userfiles()
{
    return $this->belongsToMany(User::class, 'download', 'file_id', 'user_id');
}

User.php 模型

public function files()
{
    return $this->belongsToMany(File::class, 'download', 'user_id', 'file_id');
}

2. 修复控制器下载方法

修改download方法,添加权限校验逻辑,确保仅能下载分配给自己的文件:

public function download(Request $request, int $fileId)
{
    $user = Auth::user();
    
    // 查找文件并校验权限:检查该文件是否在当前用户的可下载列表中
    $file = File::find($fileId);
    if (!$file || !$file->userfiles()->where('user_id', $user->id)->exists()) {
        abort(403, '无权限下载此文件');
    }

    // 执行下载
    return response()->download($file->file);

    // 注意:原代码中return之后的attach代码永远不会执行,若需记录下载行为,请创建独立的下载记录表(如download_records),而非复用权限分配的download表
}

3. 可选:使用Laravel Policy优化权限管理

对于更复杂的权限场景,推荐使用Laravel Policy集中管理权限逻辑:

  1. 生成Policy文件:
php artisan make:policy FilePolicy --model=File
  1. 在FilePolicy.php中定义下载权限规则:
public function download(User $user, File $file)
{
    return $file->userfiles()->where('user_id', $user->id)->exists();
}
  1. 在控制器中使用Policy校验:
public function download(Request $request, int $fileId)
{
    $file = File::findOrFail($fileId);
    $this->authorize('download', $file); // 自动校验权限,无权限时抛出403

    return response()->download($file->file);
}

关键说明

  • 原控制器中return response()->download(...)之后的代码永远不会执行,若需记录用户下载行为,请单独创建下载日志表,避免与权限分配的download表混淆。
  • 路由层的角色中间件仅限制角色访问路径,无法校验具体文件的权限,必须在控制器/Policy层添加细粒度的权限校验。

内容的提问来源于stack exchange,提问作者Delano van londen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:11:38