我正在使用this package进行维护,但要定义哪些用户可以在停机期间访问该网站,哪些用户不能访问该问题。
在过去的几天里,我一直在搜索并且阅读很多东西,因为主控制器在中间件之后加载,因此它无法检测用户状态是否为登录状态。 (我不知道我只是反复看到了)
我希望允许具有Admin
角色的用户在停机时间内访问该网站,而visitors
,other group of users
则不要。
基于软件包文档,我已使用以下数据在App\Exemptions\AdminExemption.php
中创建了定制文件:
<?php
namespace App\Exemptions;
use Auth; use Config; use App\User; use MisterPhilip\MaintenanceMode\Exemptions\MaintenanceModeExemption;
class AdminExemption extends MaintenanceModeExemption {
public function isExempt()
{
if (Auth::check() && Auth::user()->role == 'Admin') {
return true;
}
else {
return false;
}
//if user is logged and it's admin show the site
//if user is logged and isn't admin hide the site
//if user isn't logged (is visitor) hide the site
} }
我将此文件注册在软件包配置文件config\maintenancemode.php
'exemptions' => [
App\Exemptions\AdminExemption::class,
],
并在Kernel
中用laravel default替换了包类。
protected $middleware = [
// \App\Http\Middleware\CheckForMaintenanceMode::class,
\MisterPhilip\MaintenanceMode\Http\Middleware\CheckForMaintenanceMode::class,
//others...
]
Auth::check()
或auth()->user()
或Auth::user()
都无法检测到已登录的用户并假定该用户未登录(是访问者)。因此,该网站对所有人甚至管理员都关闭了。
如何在AdminExemption.php
文件中获取当前用户的真实状态?
状态
show the site
don't show the site
don't show the site
有什么主意吗?
答案 0 :(得分:1)
您已经在中间件主堆栈中注册了中间件,这将在中间件组进入中间件之前进行。您可能需要将中间件在内核中向下移动到web
中间件堆栈中。这是因为Laravel仅在存在会话的情况下才知道已登录的用户-该会话仅在Web堆栈中启动。
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
您需要将中间件放置在StartSession
中间件之后-但是您最好将其弹出到最后,然后登录状态应该在中间件中可用。< / p>