Laravel - 在Middleware Auth上包含资产

Cai*_*aki 6 php laravel laravel-5.5

在我的应用程序内部,存在一个名为的路由组admin,该组内的任何路由都会调用两个资源:public/css/admin.css并且public/js/admin.js,但是任何未经身份验证的用户都可以访问这些文件.如何在Auth Middleware中包含这些文件?

我的管理路线:

Route::group(['prefix' => 'admin', 'middleware' => ['auth']], function () {
    Route::get('/', 'Admin\IndexController@index')->name('panel');

    Route::group(['prefix' => 'users'], function() {});

    Route::group(['prefix' => 'settings'], function() {});

    Route::fallback('Admin\ExceptionController@exception');
});
Run Code Online (Sandbox Code Playgroud)

我的资源链接:

http://localhost:3000/css/admin.css
http://localhost:3000/js/admin.js
Run Code Online (Sandbox Code Playgroud)

我的资源链接应该是:

http://localhost:3000/admin/css/admin.css
http://localhost:3000/admin/js/admin.js
Run Code Online (Sandbox Code Playgroud)

如果我只需要创建一个文件夹admin里面public的文件夹我刚刚得到一个403错误...

我能做些什么呢?

vpe*_*osa 5

我想你正在使用它,因为你不希望未经身份验证的用户知道这些css/js文件的内容.您的css/js文件中不应包含任何敏感信息,因此服务它们没有问题.

否则,如果要限制对文件的访问,则应通过PHP下载文件.例如,您可以将文件放在公共文件夹之外,并通过获取文件内容并供下载的方法使其可以条件下载.

您应该可以创建该公共管理文件夹,检查文件权限和文件所有权.


Tah*_*aza 2

更新:现在我们将使用存储而不是公共目录。

虽然我同意您的 css/js 文件中不应包含任何敏感信息,但如果您确实想将文件提供给经过身份验证的用户,您可以通过此解决方案来实现。

注意:我已在 git 上公开提供该项目,因此您可以根据需要从那里克隆。Git 仓库

  1. 创建具有权限的管理资产目录755
  2. 创建一个辅助函数来服务管理资产。
  3. 使辅助功能在 Blade 中可用。
  4. 使用辅助函数链接资产,以便首先进行身份验证,然后提供文件。

基本思想:

  • 基本思想是拥有一个任何人都无法通过浏览器访问的目录。
  • 验证用户身份
  • 从受保护的目录复制文件。
  • 将文件粘贴到仅与经过身份验证的用户关联的新目录(在存储中)。
  • 用户注销时删除关联的目录。

执行:

  1. 创建了一个名为publicadmin_assets目录的目录。
  2. 将目录的权限改为755.
  3. 创建了一个名为 的帮助程序类CommonHelper,并编写函数来提供和删除管理资产。
  4. 使用这些辅助函数为资产提供服务,如下所示:

<link href="{{ asset( CommonHelper::serveAdminAssets('app.css', '/css/') ) }}" rel="stylesheet">

  1. 注销时删除了文件。

最后,只要用户登录,文件就可供他/她使用,一旦用户注销,所有文件将从文件夹中删除。

通用助手类:

<?php
/**
 *
 */
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;

class CommonHelper {
  public static function serveAdminAssets($fileName, $filePath) {

    if( Auth::check() ) {
      $adminAssetsBasePath = public_path().'/admin_assets';

      $source = $adminAssetsBasePath.$filePath.$fileName;

      $destDir = 'public/'.Auth::user()->id.$filePath;

      $dest = $destDir.$fileName;

      Storage::put($dest, file_get_contents($source));

      return Storage::url($dest);
    } else {
      return '';
    }
  }

  public static function removeAdminAssets($id) {

      $destDir = storage_path('app/public/'.Auth::user()->id);
      File::cleanDirectory($destDir);
      File::deleteDirectory($destDir);
  }
}
 ?>
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 请记住,如果您使用本地驱动程序,则所有应可公开访问的文件都应放置在 storage/app/public 目录中。此外,您应该在 public/storage 处创建一个指向 storage/app/public 目录的符号链接。文档

  2. 在删除目录之前,您应该先清空它。