首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel链路安全

Laravel链路安全
EN

Stack Overflow用户
提问于 2022-10-21 10:08:15
回答 2查看 22关注 0票数 0

因此,我有一个拉拉项目与多个角色的(管理,合作伙伴,经销商)作为经销商和合作伙伴,我可以下载文件分配给我使用一个枢轴表。

作为合作伙伴,我可以看到分配给我的角色的一个文件可以下载。但是在我的数据库中,一个经销商可以下载多个文件。但是,如果我编辑链接:http://localhost:8000/partner/download/{file id,我也可以作为合作伙伴下载所有文件。

我想保护这个安全,所以我只能下载分配给这个特定角色的文件。

表文件:

  • Id
  • 名字
  • 语言
  • 文件(可下载)

表用户:

  • Id
  • 名字
  • role_id

表的作用;

  • id
  • 名字

表格下载(文件和用户的枢轴):

  • id
  • file_id
  • user_id

下载控制器:

代码语言:javascript
复制
  public function download(Request $request, int $fileId)
    {
        $id = Auth::user();
        $fullfile = File::find($fileId);
       
        $downloadfile = File::find($fullfile, ['file'])->pluck('file')->last();

        return response()->download($downloadfile);
       $fullfile->userfile()->attach($id);
        return back();
    }

web.php

代码语言:javascript
复制
Route::group(['middleware' => 'role:partner', 'prefix' => 'partner', 'as' => 'partner.'], function(){

    Route::resource('/dashboard', App\Http\Controllers\partner\PartnerController::class);
   Route::resource('/profile', App\Http\Controllers\partner\ProfileController::class);
   Route::resource('/file', App\Http\Controllers\partner\FileController::class);
   Route::get('/download/{fileId}',[FileController::class, 'download'])->name('file.download');
});

index.blade.php

代码语言:javascript
复制
<tbody>
                    @foreach($files as $file)
                    <tr>
                        <td>{{$file->title}} </td>
                        <td>
                            <a class="btn btn-big btn-succes" style="background: orange;" href="{{ route('partner.file.show', $file->id) }}">View</a>
                        </td>
                        <td>
                            <a class="btn btn-big btn-succes" style="background: green;" href="{{ route('partner.file.download', $file->id) }}" >Download</a>
                        </td>
                        <td>{{@$file->language->name}} </td>
                        @foreach($file->tag as $tags)
                        <td style="background:{{$tags['color']}} ;">{{@$tags->name}} </td>
                        @endforeach
                        
                    </tr>
                    @endforeach
                </tbody>
    ```
EN

回答 2

Stack Overflow用户

发布于 2022-10-21 10:22:08

我想你有几张有关系的桌子:

用户、角色、文件

用户:角色- N:1角色: Files M:N (也就是说,如果您的文件是多态的,或者您希望某个文件被多个角色下载,如果两者都没有,那么1:N就足够了)

如果没有,请提供您为他们提供的架构。

但是,如果您有这样的模式,那么应该比较容易,您只需要为路由http://localhost:8000/partner/download/{file id}使用中间件,它将按角色过滤掉用户,如果无法访问就返回404。

如果您提供的路由是位于/public目录中的文件的路径(这意味着您将文件存储在/public/partner/download中),我建议为数据库中的每个文件创建一个散列(类似于Str::http://localhost:8000/partner/download/{hash} (16))并使用路由http://localhost:8000/partner/download/{hash}

票数 0
EN

Stack Overflow用户

发布于 2022-10-21 11:22:03

使用策略怎么样?

Laravel政策

代码语言:javascript
复制
class FilePolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view any models.
     *
     * @param  \App\Models\User  $user
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function view(User $user, File $file)
    {
         return $user->role_id == 'Partner';
    }
}

然后在控制器中添加

代码语言:javascript
复制
  public function download(Request $request, int $fileId)
    {
        $fullfile = File::find($fileId);

        $this->authorize('view',$fullFile);

        $id = Auth::user();
       
        $downloadfile = File::find($fullfile, ['file'])->pluck('file')->last();

        return response()->download($downloadfile);
        $fullfile->userfile()->attach($id);
        return back();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74152035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档