如何保护Laravel Storage文件夹

问题描述 投票:2回答:1

在我的项目中,我为控制器和路由实现了auth和ACL。我只有在用户登录时才能访问文件上传系统。它工作正常。

我的问题是上传的文件。如果有文件URL,用户可以访问任何文件。如何在上传的文件上实现auth?

我尝试使用路由,但是当通过浏览器访问我的文件时,文件显示为没有拦截此URL的路由。

我用过这段代码:

Route::get('/storage/document/3/4a15c1ab060be8f35.png', function () {
  return 'ok';
});

如何在存储上的特定文件夹上实现auth?谢谢!

php laravel authentication storage acl
1个回答
4
投票

如果您想根据某种权限限制每个用户访问文件,您需要自己构建该权限逻辑(StackOverflow不会为您完成工作),但为了回答这个问题,让我们假设您已经拥有该权限系统,并且为了检查用户是否具有访问权限,我们的功能是hasAccessToFile,它基本上只是根据您的业务逻辑需要进行查找。

您可以提供单个文件,而不是公开提供所有文件,这是一个非常简单的示例:

Route::get('files/{pathToFile}', function($pathToFile) {

    if (auth()->user()->hasAccessToFile($pathToFile)) {
        return response()->file($pathToFile);
    } else {
        return 'Nope, sorry bro, access denied!';
    }

});

请参阅File Responses文档。

如果您需要提供文件的下载而不是提供它们,请执行以下操作:

Route::get('files/{pathToFile}', function($pathToFile) {

    if (auth()->user()->hasAccessToFile($pathToFile)) {
        return response()->download($pathToFile);
    } else {
        return 'Nope, sorry bro, access denied!';
    }

});

请参阅File Downloads文档。


1
投票

你可以参考我的答案here。该过程包括创建新的存储磁盘,该文件将文件保存在/storage/app/(不在公共文件夹中),并在将文件提供给用户之前验证请求。

© www.soinside.com 2019 - 2024. All rights reserved.