Laravel - 在Middleware Auth上包含资产

时间:2018-02-21 00:05:30

标签: php laravel laravel-5.5

在我的应用程序中,存在一个名为SUBSTITUTE($A2," ","/",LEN($A2)-LEN(SUBSTITUTE($A2," ","")))的路由组,该组内的任何路由都会调用两个资源:adminpublic/css/admin.css,但任何未经身份验证的用户都可以访问这些文件。如何在Auth Middleware中包含这些文件?

我的管理路线:

public/js/admin.js

我的资源链接:

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');
});

我的资源链接应该是:

http://localhost:3000/css/admin.css
http://localhost:3000/js/admin.js

如果我只是在http://localhost:3000/admin/css/admin.css http://localhost:3000/admin/js/admin.js 文件夹中创建文件夹admin,我刚收到403错误...

我该怎么办?

4 个答案:

答案 0 :(得分:5)

我认为您正在使用它,因为您不希望未经身份验证的用户知道这些css / js文件的内容。 你不应该在你的css / js文件中有任何敏感信息,所以提供它们没有问题。

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

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

答案 1 :(得分:2)

以下是您可以申请的示例。

将资产存储在storage目录中。

然后你可以检查它是否是管理员。

在您的视图中,您可以注入Admin Assets Like。

<script>
  {!! \Storage::disk('urdisk name')->get('admin.js'); !!}
</script>

你的css可以

 <style>
  {!! \Storage::disk('urdisk name')->get('admin.css'); !!}
</style>

希望这有帮助

答案 2 :(得分:1)

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

虽然我同意您的css / js文件中不应包含任何敏感信息,但如果您确实要将文件提供给经过身份验证的用户,则可以使用此方法进行此操作。

注意:我已将该项目公开用于git,因此您可以根据需要从那里进行克隆。 Git Repo

  1. 为具有权限755
  2. 的管理资产创建目录
  3. 创建一个帮助函数来提供管理资产。
  4. 在刀片中使用辅助功能。
  5. 使用帮助程序功能链接资产,以便首先进行身份验证,然后提供文件。
  6. 基本理念

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

    <强>实施

    1. 公共目录中创建名为admin_assets的目录。
    2. 将目录的权限更改为755
    3. 创建了一个名为CommonHelper的帮助程序类,并将函数写入提供删除管理资产。
    4. 使用以下帮助函数提供资产:
    5. <link href="{{ asset( CommonHelper::serveAdminAssets('app.css', '/css/') ) }}" rel="stylesheet">

      1. 在退出时删除了文件。
      2. 最后,就用户登录而言,他/她可以使用文件,一旦用户退出,所有文件都将从文件夹中删除。

        CommonHelper 类:

        <?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);
          }
        }
         ?>
        

        备注:

        1.   

          请记住,如果您使用的是本地驱动程序,那么应该是所有文件   可公开访问的应放在storage / app / public中   目录。此外,您应该在。创建一个符号链接   公共/存储指向存储/ app / public目录。 Docs

        2.   

          在删除目录之前,您应先将其清空。

答案 3 :(得分:0)

要将auth应用于您需要从laravel进行的资产文件,而不是使用完整路径访问文件,您需要通过路由访问css / js文件laravel将能够在路由组内的每个文件上应用auth。

P.S 文件必须保存在存储文件夹中,即storage/admin.css

更新了路线组

Route::group(['prefix' => 'admin', 'middleware' => ['auth']], function () {

Route::get('/', 'Admin\IndexController@index')->name('panel');

Route::get('{file}', 'StaticFileController@serveFile');

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

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

Route::fallback('Admin\ExceptionController@exception');
});

<强>控制器

namespace App\Http\Controllers;

use Illuminate\Http\Request;
Use Response;

use App\Http\Requests;

class StaticFileController extends Controller
{
    public function serveFile ($file)
    {

        $storagePath = storage_path($file);
        $mimeType = mime_content_type($storagePath);
        if( ! \File::exists($storagePath)){
            return view('errorpages.404');
        }
        $headers = array(
            'Content-Type' => $mimeType,
            'Content-Disposition' => 'inline; filename="'.$file.'"'
        );
        return Response::make(file_get_contents($storagePath), 200, $headers);

    }
}

现在您的资源链接将是

http://localhost:3000/admin/css/admin.css
http://localhost:3000/admin/js/admin.js

希望这有帮助