【问题标题】:Secure Asset/Media Folder through Auth Controller ? Laravel 5.2通过身份验证控制器保护资产/媒体文件夹?拉拉维尔 5.2
【发布时间】:2016-09-12 00:55:23
【问题描述】:

我有公共/资产/媒体/文件夹

我可以像下面这样公开访问这个文件。

http://localhost/myapp/public/Asset/Media/1/phpunit.xml

同样,资产/媒体文件夹中还有其他文件夹正在动态创建。

这些子文件夹中也存在许多文件,并且也存在于 Asset/Media 文件夹中

有什么办法,如果我尝试访问 Asset/Media 文件夹中的任何文件或 Asset/Media 文件夹子文件夹中存在的任何文件,我应该被重定向到登录页面,因为身份验证未完成?

我的意思是,我可以使用Auth 中间件来保护这个文件夹吗?如果是这样,如果我们必须从 Android 应用程序访问文件,这是一种有效的方法吗?

【问题讨论】:

    标签: php android laravel-5 laravel-5.2


    【解决方案1】:

    如果你想保护文件,它们需要通过 Laravel。像你一样访问文件(使用完整路径)不会通过 Laravel。您可以通过创建路由来实现:

    Route::group(['middleware' => ['auth']], function () {
        Route::get('/secure/file/{file_name}', 'FileController@file');
    }
    

    然后,创建一个控制器来访问该文件,以便您可以使用 Auth 来检查访问权限。这也意味着您应该将文件放在无法访问的位置,并使用 Laravel 文件系统使用 PHP 访问文件:

    class FileController extends Controller {
        public function file()
        {
            return Storage::get('path/to/phpunit.xml');
        }
    }
    

    【讨论】:

    • 如果我们必须从 Android 应用程序访问文件,这是有效的方法吗?
    • 我认为通过 Android 应用程序访问文件没有问题,但如果您使用这种方法提供大量/大量文件,这种方法可能会消耗比预期更多的资源。
    【解决方案2】:

    Laravel 5.2 已经引入了 HTTP 中间件,我建议你这样做。

    https://laravel.com/docs/5.2/middleware#middleware-groups

    这个帖子可能会帮助你让它工作......

    Laravel 5.2 Auth not Working

    【讨论】:

      【解决方案3】:

      使用下面的路线:

      Route::get('/myapp/public/Asset/Media/{id}', function ($id) {
          if (Auth::guest()){
              return Redirect::guest('login');
          }else{
               $img="/myapp/public/Asset/Media/".$id;
                  if(File::exists($img)) {
               return Response::make($img, 200, array('content-type' => 'image/jpg'));
                  }else{
                      return false;
                  }
      })->where('id', '.+');
      

      【讨论】:

      • 如果我们必须从 Android 应用程序访问文件,这是有效的方法吗?
      • 这根本不起作用。我仍然能够以匿名用户身份查看文件
      【解决方案4】:

      我的示例网址在这里:

      http://domainname.com/storage/Asset/Media/1/filename.txt

      我的路线

      Route::get('/storage/Asset/Media/{ID}/{file}', array(
          'as' => 'Files',
          'uses' => 'User\Account\Media\MediaController@DownloadMedia',
      ));
      

      控制器动作方法

      public function DownloadMedia($ID) {
          $headers = array(
              'Content-Type'        => 'application/octet-stream',
              'Content-Disposition' => 'attachment; filename=somefile.txt"'
          );
      
          return response()->download(base_path("storage/Asset/Media/1/somefile.txt"));
      }
      

      重要的是我可以使用 application/octet-stream 下载任何文件类型。

      【讨论】:

        【解决方案5】:

        由于 Laravel 使用重写规则,每个人都可以访问公共文件夹中的文件,当有人访问公共文件夹中的文件时,甚至不会调用 Laravel。

        因此,您必须将受限文件放在其他地方,也许在存储文件夹中,但最终没关系。

        将所有资产/媒体文件夹放入存储文件夹并更新创建文件夹的代码后 (How storage works)。

        创建一个文件控制器:

        PHP

        class FileController extends Controller {
            public function __construct() {
                $this->middleware('auth');
            }
        
            public function downloadFile($filename) {
                return response()->download(storage_path($filename), null, [], null);
            }
        }
        

        配置这条路由:

        Route::get('file/{filename}', 'FileController@downloadFile')->where('filename', '^[^/]+$');
        

        就是这样,现在只有经过身份验证的用户才能将资产文件下载到中间件身份验证中,这也适用于 Android 应用。

        【讨论】:

          猜你喜欢
          • 2017-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多