【问题标题】:Auth::guard('user')->user() is null in Laravel 5.3Auth::guard('user')->user() 在 Laravel 5.3 中为空
【发布时间】:2017-03-29 13:17:57
【问题描述】:

我正在尝试像这样将当前用户对象传递给所有模板:

class Controller extends BaseController
{
    public function __construct()
    {
        view()->share('usr', Auth::guard('user'));
    }
}

每个控制器都由控制器扩展。但是,如果我尝试转储 Auth::guard('user')->user() Laravel 返回 null,尽管我已登录。此外,当我将此变量传递给模板时,{{ $usr->user() }} 返回当前用户。我做错了什么?

我的配置/auth.php

'defaults' => [
    'guard' => 'user',
    'passwords' => 'users',
],
'guards' => [
        'user' => [
            'driver' => 'session',
            'provider' => 'user',
        ],
    ],
'providers' => [
        'user' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],

内核.php

         protected $middleware = [
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
 ];

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        //\App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

我自己的登录功能:

public function authorizes(Request $request)
{
        $this->validate($request, [
        'login' => 'required|max:50',
        'password' => 'required|max:50'
    ]);

        $credentials = $request->only(['login', 'password' ]);
        $remember = $request->get('remember', false) == 1 ? true : false;

    if ($this->guard->attempt( $credentials, $remember)) {
        $user = $this->guard->user();
        $user->last_login = date('Y-m-d H:i:s');
        $user->save();
        return redirect()->route( 'homepage' )->withSuccess(trans('app.login.success'));
    }
    return redirect()->back()->withErrors(trans('app.wrong.credentials'));
}

【问题讨论】:

    标签: laravel authentication laravel-5 laravel-5.3 guard


    【解决方案1】:

    尝试这样做:

    view()->share('usr', Auth::user());
    

    或者这个:

    view()->share('usr', auth()->user());
    

    【讨论】:

    • 两种情况下都为空
    • 你确定你已经登录了吗?请仔细检查。您是否更改了与会话相关的功能或其他内容?您是否手动将 web 中间件添加到您的路由中?
    • 在其他控制器中,由这个控制器扩展它返回当前用户... 100% 我登录了! Route::group(['middleware' => 'auth'], function () { // all my routes } Route::get('/login', [ 'as' => 'login', 'uses' => 'AuthController@login' ] ); Route::get('/logout', [ 'as' => 'logout', 'uses' => 'AuthController@logout' ] ); Route::post('/login', [ 'as' => 'authorize', 'uses' => 'AuthController@authorizes' ] );
    【解决方案2】:

    首先检查用户是否登录,然后将当前用户共享为:

    public function __construct()
    {
        if (auth()->check()) {
            $this->currentUser = auth()->user();
            View::share('currentUser', $this->currentUser);
        } else {
          // you can redirect the user to login page.
        }
    }
    

    【讨论】:

    • 但在 Controller 中它总是返回 false。在Controller扩展的其他控制器中,返回true
    【解决方案3】:

    在你的情况下,有两件事需要考虑

    1. 要获得实际的用户模型,你应该这样做Auth::guard('user')->user()
    2. Auth::user() 在调用view()->share() 时实际上还没有初始化,见https://github.com/laravel/framework/issues/6130

    因此,您宁愿使用视图作曲家。在AppServiceProviderboot 方法中添加:

    \View::composer('*', function ($view) {
        $view->with('usr', \Auth::guard('user')->user());
    });
    

    【讨论】:

      【解决方案4】:

      在 Laravel 5.3 中,您应该像这样更改控制器构造函数以使其正常工作(假设您至少使用 Laravel 5.3.4):

      public function __construct()
      {
          $this->middleware(function ($request, $next) {
              view()->share('usr', Auth::guard('user'));
      
              return $next($request);
          });
      }
      

      您可以在Upgrade guide 中看到此更改:

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

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

      【讨论】:

      • 这是正确答案,昨天真的遇到了这个!
      猜你喜欢
      • 1970-01-01
      • 2017-06-29
      • 2017-04-30
      • 2017-06-21
      • 1970-01-01
      • 2016-04-02
      • 2017-03-17
      • 2018-08-11
      • 2021-07-29
      相关资源
      最近更新 更多