在laravel中间件中获取用户当前状态

时间:2019-01-25 04:02:50

标签: php laravel maintenance-mode

我正在使用this package进行维护,但要定义哪些用户可以在停机期间访问该网站,哪些用户不能访问该问题。

在过去的几天里,我一直在搜索并且阅读很多东西,因为主控制器在中间件之后加载,因此它无法检测用户状态是否为登录状态。 (我不知道我只是反复看到了

无论如何这里都是问题所在

我希望允许具有Admin角色的用户在停机时间内访问该网站,而visitorsother 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文件中获取当前用户的真实状态?

状态

  1. 是用户(是管理员)show the site
  2. 是用户(不是管理员)don't show the site
  3. 不是用户(访问者)don't show the site

有什么主意吗?

1 个答案:

答案 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>