为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Laravel 5中保护图像免受公众观看?

如何在Laravel 5中保护图像免受公众观看?

波斯汪 2019-11-02 10:12:39
我已经安装了Laravel 5.0并进行了身份验证。一切正常。我的网站仅对经过身份验证的成员开放。内部的内容仅受身份验证成员的保护,但网站内的图像不受公共视图的保护。任何人直接写入图像URL都可以看到该图像,即使该人未登录系统也是如此。http://www.somedomainname.net/images/users/userImage.jpg我的问题:是否可以保护图像(上面的URL示例)不受公开查看,换句话说,如果图像的URL发送给任何人,则该个人必须是成员并登录才能看到该图像。那有可能吗?
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

我实际上并没有尝试过,但是我找到了Nginx auth_request模块,该模块允许您从Laravel检查身份验证,但仍然使用Nginx发送文件。


它向给定的URL发送内部请求,并检查http代码是否成功(2xx)或失败(4xx),如果成功,则让用户下载文件。


编辑:另一个选项是我尝试过的东西,它似乎工作正常。您可以使用 X-Accel-Redirect-header从Nginx提供文件。该请求通过PHP进行,但不是通过发送整个文件,而是将文件位置发送到Nginx,然后Nginx将其提供给客户端。


查看完整回答
反对 回复 2019-11-02
?
LEATH

TA贡献1936条经验 获得超6个赞

在上一个项目中,我通过执行以下操作来保护上传:


创建的存储磁盘:


config/filesystems.php

'myDisk' => [

        'driver' => 'local',

        'root' => storage_path('app/uploads'),

        'url' => env('APP_URL') . '/storage',

        'visibility' => 'private',

    ],

这会将\storage\app\uploads\无法上载的文件上传到公众。


要将文件保存在控制器上:


Storage::disk('myDisk')->put('/ANY FOLDER NAME/' . $file, $data);

为了使用户查看文件并保护上传内容免受未经授权的访问。首先检查磁盘上是否存在文件:


public function returnFile($file)

{

    //This method will look for the file and get it from drive

    $path = storage_path('app/uploads/ANY FOLDER NAME/' . $file);

    try {

        $file = File::get($path);

        $type = File::mimeType($path);

        $response = Response::make($file, 200);

        $response->header("Content-Type", $type);

        return $response;

    } catch (FileNotFoundException $exception) {

        abort(404);

    }

}

服务的文件,如果用户有权访问:


 public function licenceFileShow($file)

{

    /**

     *Make sure the @param $file has a dot

     * Then check if the user has Admin Role. If true serve else

     */

    if (strpos($file, '.') !== false) {

        if (Auth::user()->hasAnyRole(['Admin'])) {

            /** Serve the file for the Admin*/

            return $this->returnFile($file);

        } else {

            /**Logic to check if the request is from file owner**/

            return $this->returnFile($file);

        }

    } else {

//Invalid file name given

        return redirect()->route('home');

    }

}

最后在Web.php路由上:


Route::get('uploads/user-files/{filename}', 'MiscController@licenceFileShow');


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 607 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信