如何保护 Laravel 个存储文件夹

How to secure Laravel Storage folders

在我的项目中,我为我的控制器和路由实现了身份验证和 ACL。我有一个只有在用户登录后才能访问的文件上传系统。工作正常。

我的问题出在上传的文件上。如果有文件URL,用户可以访问任何文件。我如何对上传的文件实施授权?

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

我用过这个代码:

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

如何对存储上的特定文件夹实施身份验证?谢谢!

如果你想根据某种权限限制每个用户对文件的访问,你需要自己构建权限逻辑(Whosebug 不会为你完成你的工作),但为了为了回答这个问题,我们假设您已经有了该权限系统,并且为了检查用户是否具有访问权限,我们的函数是 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 文档。

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