如何将 CKFinder 与 Laravel 5.2 集成?
How to integrate CKFinder with Laravel 5.2?
由于 Laravel 5.2 仅与包含在 "web" 中间件组中的路由共享它的会话,我不再可以 运行 Auth::check() 在 CKFinder 配置中。有人知道如何解决这个问题吗?
更新:
我曾经与 CKFinder 共享 laravel 的 5 会话,以便为授权用户提供访问权限。像这样:
require __DIR__.'/../../bootstrap/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Http\Kernel')
->handle(Illuminate\Http\Request::capture());
function CheckAuthentication()
{
return Auth::check() && auth()->user()->isAdmin();
}
但是现在由于所有路由都应该用 'web' 中间件包装在组中,该组之外的路由不允许使用 Auth::user()
Route::group(['middleware' => 'web'], function () {
});
如何将 CKFinder 路由到 'web' 中间件以便能够使用 Laravel 的会话?
很简单。
只需修改 Kernel.php
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Session\Middleware\StartSession::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
然后再试一次。
内核对象有一个函数"pushMiddleware"。
使用这个函数来运行中间件"EncryptCookies"和"StartSession"。
对我有用:)
require __DIR__.'/../../bootstrap/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Http\Kernel')
->pushMiddleware(\App\Http\Middleware\EncryptCookies::class)
->pushMiddleware(\Illuminate\Session\Middleware\StartSession::class)
->handle(Illuminate\Http\Request::capture());
function CheckAuthentication()
{
return Auth::check() && auth()->user()->isAdmin();
}
我不认为这里接受的答案是解决这个问题的方法,上传文件时另一个答案不起作用(MethodNotAllowed 异常)。
我通过使用常规会话让它工作 - 所以在 Laravel 中,在用户登录时:
session_start();
$_SESSION['ckfinder_auth'] = true;
用户注销时:
session_start();
unset($_SESSION['ckfinder_auth']);
在 ckfinder 配置中:
session_start();
function CheckAuthentication()
{
return !empty($_SESSION['ckfinder_auth']);
}
在 Laravel 中使用常规会话有点麻烦,但它有效,而且安全。
由于 Laravel 5.2 仅与包含在 "web" 中间件组中的路由共享它的会话,我不再可以 运行 Auth::check() 在 CKFinder 配置中。有人知道如何解决这个问题吗?
更新: 我曾经与 CKFinder 共享 laravel 的 5 会话,以便为授权用户提供访问权限。像这样:
require __DIR__.'/../../bootstrap/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Http\Kernel')
->handle(Illuminate\Http\Request::capture());
function CheckAuthentication()
{
return Auth::check() && auth()->user()->isAdmin();
}
但是现在由于所有路由都应该用 'web' 中间件包装在组中,该组之外的路由不允许使用 Auth::user()
Route::group(['middleware' => 'web'], function () {
});
如何将 CKFinder 路由到 'web' 中间件以便能够使用 Laravel 的会话?
很简单。 只需修改 Kernel.php
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Session\Middleware\StartSession::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
然后再试一次。
内核对象有一个函数"pushMiddleware"。
使用这个函数来运行中间件"EncryptCookies"和"StartSession"。
对我有用:)
require __DIR__.'/../../bootstrap/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Http\Kernel')
->pushMiddleware(\App\Http\Middleware\EncryptCookies::class)
->pushMiddleware(\Illuminate\Session\Middleware\StartSession::class)
->handle(Illuminate\Http\Request::capture());
function CheckAuthentication()
{
return Auth::check() && auth()->user()->isAdmin();
}
我不认为这里接受的答案是解决这个问题的方法,上传文件时另一个答案不起作用(MethodNotAllowed 异常)。
我通过使用常规会话让它工作 - 所以在 Laravel 中,在用户登录时:
session_start();
$_SESSION['ckfinder_auth'] = true;
用户注销时:
session_start();
unset($_SESSION['ckfinder_auth']);
在 ckfinder 配置中:
session_start();
function CheckAuthentication()
{
return !empty($_SESSION['ckfinder_auth']);
}
在 Laravel 中使用常规会话有点麻烦,但它有效,而且安全。