【问题标题】:Auth::user() returns null on Module __construct()Auth::user() 在模块 __construct() 上返回 null
【发布时间】:2018-11-30 10:15:18
【问题描述】:

我使用laravel-modules 创建了一个名为Article 的新模块。一些后端路由需要身份验证,我添加了auth 中间件和一个额外的权限view_backend。我正在使用https://github.com/spatie/laravel-permission 包获取角色权限。

问题是当我尝试访问路由 admin/article/posts 时,它会按预期提示我登录。但是登录后它在__construct() 方法上为Auth::user() 显示null;

我添加了web 中提到的#204 中间件,但它并没有解决问题。你能指导我解决这个问题吗?我的项目在 Laravel 5.6 上并使用最新版本的 Laravel-Modules

Route::group(['namespace' => 'Modules\Article\Http\Controllers\Backend', 'as' => 'backend.article.', 'middleware' => ['web', 'auth', 'can:view_backend'], 'prefix' => 'admin/article'], function () {

    Route::resource("posts", "PostsController");
});

我的项目托管在 Github,https://github.com/nasirkhan/laravel-starter/tree/module

【问题讨论】:

    标签: laravel laravel-authentication


    【解决方案1】:

    根据文档:

    在以前的 Laravel 版本中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的明确功能。在 Laravel 5.3 中,您无法在控制器的构造函数中访问会话或经过身份验证的用户,因为中间件尚未运行。

    作为替代方案,您可以直接定义基于闭包的中间件 在控制器的构造函数中。在使用此功能之前,请确保 你的应用程序正在运行 Laravel 5.3.4 或更高版本:

    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;
    
            return $next($request);
        });
    }
    

    或者你可以输入提示:

    public function index(Request $request)
    {
        $projects = $request->user()->projects;
    
        $value = $request->session()->get('key');
    }
    

    Docs

    【讨论】:

      【解决方案2】:

      首先,将Spatie Middleware 添加到您的内核中:

      protected $routeMiddleware = [
          // ...
          'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
          'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
      ];
      

      然后在您的控制器中检查权限或角色:

      public function __construct(Request $request)
          {
              $this->middleware(['permission: order.index']);
          }
      

      现在您可以使用 $request->user() 访问您的身份验证,例如:

      public function create(Request $request)
          {
              if ($request->user()->hasRole('admin')) {
      
                 // return view("carmodel.create", ["manufacturers"=>$manufacturers]);
              } else {
                  return view("admin.error", ['code'=>'001','msg'=>'err']);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2016-05-11
        • 2023-02-04
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 2016-05-13
        • 2020-08-14
        • 2021-11-04
        • 2017-03-17
        相关资源
        最近更新 更多