php laravel authentication laravel-5.3

php - Laravel 5.3 auth check en el constructor devuelve false



authentication laravel-5.3 (3)

Dado que 5.3 Auth::check no funcionará en el constructor de un controlador, es uno de los cambios no documentados. Por lo tanto, debe moverlo al middleware o verificar los métodos del controlador o mover el proyecto a 5.2.x.

Estoy usando Laravel 5.3 y estoy tratando de obtener la id del usuario autenticado en el método del constructor para poder filtrar al usuario por compañía asignada de la siguiente manera:

namespace App/Http/Controllers; use Illuminate/Foundation/Bus/DispatchesJobs; use Illuminate/Routing/Controller as BaseController; use Illuminate/Foundation/Validation/ValidatesRequests; use Illuminate/Foundation/Auth/Access/AuthorizesRequests; use Illuminate/Support/Facades/View; use App/Models/User; use App/Models/Company; use Illuminate/Support/Facades/Auth; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests ; public $user; public $company; public function __construct() { $companies = Company::pluck(''name'', ''id''); $companies->prepend(''Please select''); view()->share(''companies'', $companies); $this->user = User::with(''profile'')->where(''id'', /Auth::id())->first(); if(isset($this->user->company_id)){ $this->company = Company::find($this->user->company_id); if (!isset($this->company)) { $this->company = new Company(); } view()->share(''company'', $this->company); view()->share(''user'', $this->user); } }

Sin embargo, esto no devuelve la id usuario. Incluso probé Auth::check() y no funciona.

Si muevo Auth::check() fuera del método __construct() , esto funciona de la siguiente manera:

<?php namespace App/Http/Controllers; use Illuminate/Http/Request; class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct() { parent::__construct(); $this->middleware(''auth''); } /** * Show the application dashboard. * * @return /Illuminate/Http/Response */ public function index() { dd(/Auth::check()); return view(''home''); } }

Sin embargo, esto falla si pongo esto en el método de construcción en HomeController también.

¿Alguna idea de por qué esto está fallando?


Falla porque llamas a $this->middleware(''auth''); después del parent::__construct(); . Significa que el middleware de autenticación no está cargado correctamente.


docs

no puede acceder a la sesión o al usuario autenticado en el constructor de su controlador porque el middleware aún no se ha ejecutado.

Como alternativa, puede definir un middleware basado en Closure directamente en el constructor de su controlador. Antes de usar esta función, asegúrese de que su aplicación esté ejecutando Laravel 5.3.4 o superior:

class ProjectController extends Controller { /** * All of the current user''s projects. */ protected $projects; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware(function ($request, $next) { $this->projects = Auth::user()->projects; return $next($request); }); } }