首页 文章

Auth :: user()返回null

提问于
浏览
12

我使用Laravel 5.2并且遇到中间件问题 . routes.php中有代码

use Illuminate\Contracts\Auth\Access\Gate;


    Route::group(['middleware' => 'web'], function () {

        Route::auth();

        Route::get('/', 'HomeController@index');
    });


    Route::group(['prefix'=>'admin',  'middleware' => 'admin'], function(){
        Route::get('/', function(){
            return view('admin.index');
        });
        Route::get('/user', function(){
            return view('admin.user');
        });
    });

Kernel.php:

protected $routeMiddleware = [
    ...
     'admin' => \App\Http\Middleware\AdminPanel::class,
    ];

AdminPanel.php

namespace App\Http\Middleware;


    use Closure;
    use Illuminate\Support\Facades\Auth;
    use App\Role;

    class AdminPanel
    {
        public function handle($request, Closure $next)
        {
            $user = Auth::user();
            dd($user);

            if($user){
                $role = Role::whereName('admin')->first();
                if($user->hasRole($role)){
                    return $next($request);
                }
            }
            return redirect('/');
        }

所以,

$user = Auth::user()

始终返回null . 谢谢你的建议!

2 回答

  • 17

    我面临的情况是 Auth::user() 总是返回 null ,这是因为我试图在控制器的构造函数中获取 User .

    我意识到您无法访问控制器构造函数中的经过身份验证的用户,因为中间件尚未运行 .

    作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件 .

    namespace App\Http\Controllers;
    
    use App\User;
    use Illuminate\Support\Facades\Auth;
    use App\Http\Controllers\Controller;
    
    class ProjectController extends Controller
    {
        protected $user;
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware(function ($request, $next) {
    
                $this->user = Auth::user();
    
                return $next($request);
            });
        }
    }
    
  • 22

    任何使用 Auth() 的路由都必须封装在 web 中间件中 . 你很接近,只需将你的 Route::group(['prefix' => 'admin'], ...) 移到上面的组中 .

    Route::group(['middleware' => 'web'], function () {
    
        Route::auth();
    
        Route::get('/', 'HomeController@index');
    
        // Moving here will ensure that sessions, csrf, etc. is included in all these routes
        Route::group(['prefix'=>'admin',  'middleware' => 'admin'], function(){
            Route::get('/', function(){
                return view('admin.index');
            });
    
            Route::get('/user', function(){
                return view('admin.user');
            });
        });
    });
    

相关问题