Auth::user() returns null on Module __construct()

巧了我就是萌 提交于 2019-12-12 23:50:31

问题


I created a new Module named Article using laravel-modules. Some backend routes needed authentication and i added auth middleware and an additional permission view_backend. I am using https://github.com/spatie/laravel-permission package for role-permissions.

the issue is when i try to access the route admin/article/posts it prompts me the login as expected. But after login it show null on __construct() method for Auth::user();

I added web middleware as mentioned on #204 but it did not solve the issue. Can you please guide me to resolve this? My project is on Laravel 5.6 and using the latest version of 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");
});

My project is hosted at Github, https://github.com/nasirkhan/laravel-starter/tree/module


回答1:


First of all, add Spatie Middleware to your kernel:

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

Then in your controller check for permission or roles:

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

Now you can access to your authenticated with $request->user() like:

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']);
        }
    }



回答2:


According to the docs:

In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. In Laravel 5.3, you can't access the session or authenticated user in your controller's constructor because the middleware has not run yet.

As an alternative, you may define a Closure based middleware directly in your controller's constructor. Before using this feature, make sure that your application is running Laravel 5.3.4 or above:

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

        return $next($request);
    });
}

Or you could typehint it:

public function index(Request $request)
{
    $projects = $request->user()->projects;

    $value = $request->session()->get('key');
}

Docs



来源:https://stackoverflow.com/questions/50962453/authuser-returns-null-on-module-construct

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!