在我的应用程序中,存在一个名为SUBSTITUTE($A2," ","/",LEN($A2)-LEN(SUBSTITUTE($A2," ","")))
的路由组,该组内的任何路由都会调用两个资源:admin
和public/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错误...
我该怎么办?
答案 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
755
基本理念:
<强>实施强>:
admin_assets
的目录。755
。CommonHelper
的帮助程序类,并将函数写入提供和删除管理资产。 <link href="{{ asset( CommonHelper::serveAdminAssets('app.css', '/css/') ) }}" rel="stylesheet">
最后,就用户登录而言,他/她可以使用文件,一旦用户退出,所有文件都将从文件夹中删除。
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);
}
}
?>
备注:强>
请记住,如果您使用的是本地驱动程序,那么应该是所有文件 可公开访问的应放在storage / app / public中 目录。此外,您应该在。创建一个符号链接 公共/存储指向存储/ app / public目录。 Docs
在删除目录之前,您应先将其清空。
答案 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
希望这有帮助