我坚持一些我非常确定非常基本的东西..但不知怎的,我无法让它发挥作用。
我根据用户的选择创建了一个中间件来设置我的网站的区域设置(他的选择是在'locale'列下的数据库中注册的)。我所做的是我检查用户是否登录,如果他是我使用他的语言环境,如果不是我默认为英语。
出于某种原因,我的中间件永远不会“看到”用户登录并始终默认为英语。我将Auth :: check()的结果输出到日志中,实际上这总是返回false,即使用户实际已登录。
我认为这与在Auth之前执行的这个中间件有关。我试图改变内核文件中的优先级但是仍然无法工作..任何想法?
我的中间件
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class SetLocale {
public function handle($request, Closure $next) {
if(Auth::check()) {
$locale = Auth::user()->locale;
} else {
$locale = 'en';
}
\App::setLocale($locale);
return $next($request);
}
}
我的路线('auth'是默认的auth中间件,'checkProjectPermission:read'检查登录的用户是否有权访问此项目)
Route::prefix('client')->middleware(['auth','checkRoomPermission:read'])->group(function() {
Route::get('{project_id}/checklist', 'ProjectController@accessChecklist')->name('checklist');
}
My Kernel.php文件:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\SetLocale::class
];
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
\Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
\App\Http\Middleware\SetLocale::class
];
由于
答案 0 :(得分:1)
问题是您正在向全局中间件添加SetLocale
。 global
中间件不start a session
,因此您无权访问基于会话的数据 - 例如用户。
如果您查看laravel提供的web
中间件(为简洁起见而清理)
protected $middlewareGroups = [
'web' => [
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
CreateFreshApiToken::class,
StartSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class
]
]
您将了解为什么添加到web
中间件的任何中间件都可以访问auth
类,因为它会注入StartSession
。
如果您想访问基于会话的数据,那么您需要确保StartSession
已启动。
不要只需将StartSession
添加到您的全球中间件,否则您将度过难关。相反,请将其添加到auth
中间件,然后在SetLocale
之后添加StartSession
。
修改强>
请注意,如果您正在使用Web Middleware
,则必须同时向SetLocale
添加Middleware Group
。
优先级仅为nsort
,根据middleware
数组中存在的中间件重新排序应用于当前请求的middlewarePriority
。
简化:如果中间件不在路由请求的中间件组中,则中间件优先级无效。