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

Getting user current status in laravel middleware

我正在使用 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

中将包 class 替换为默认的 laravel
protected $middleware = [
        // \App\Http\Middleware\CheckForMaintenanceMode::class,
        \MisterPhilip\MaintenanceMode\Http\Middleware\CheckForMaintenanceMode::class,
//others...
]

问题

Auth::check()auth()->user()Auth::user() none 可以检测登录用户并假设用户未登录(是访客)。因此,该网站对所有人甚至管理员都关闭了。

问题

如何在 AdminExemption.php 文件中获取当前用户的真实状态?

状态

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

有什么想法吗?

您已在主中间件堆栈中注册中间件,这将在它到达中间件组之前发生。您可能希望将内核中较低的中间件移动到 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 中间件之后 - 但您可能最好只是将其弹出到最后,然后登录状态应该在您的中间件中可用.