web-dev-qa-db-fra.com

Laravel - Comment rediriger vers la connexion si l'utilisateur n'est pas authentifié

J'essaie d'utiliser le __constructor de la classe étendue (AdminController étend AdminBaseController) mais apparemment cela ne fonctionne pas et je n'ai aucune idée de ce qui peut être, ici vous pouvez voir mes deux classes:

AdminBaseController.php

class AdminBaseController extends Controller
{
    public function __construct(){
        if (!Auth::user()){
            return view('admin.pages.login.index');
        }
    }
}

AdminController.php

class AdminController extends AdminBaseController
{
    public function __construct(){
        parent::__construct();
    }

    public function index()
    {
        return view('admin.pages.admin.index');
    }

    public function ajuda()
    {
        return view('admin.pages.admin.ajuda');
    }
}

ÉDITER


Voici mon groupe de routes admin:

Route::group([
    'prefix' => 'admin',
    'middleware' => 'auth'
], function () {
    Route::get('/', 'Admin\AdminController@index');

    Route::get('login', 'Admin\AuthController@getLogin');
    Route::post('login', 'Admin\AuthController@postLogin');
    Route::get('logout', 'Admin\AuthController@getLogout');

    Route::group(['prefix' => 'configuracoes'], function () {
        Route::get('geral', 'Admin\AdminConfiguracoesController@geral');
        Route::get('social', 'Admin\AdminConfiguracoesController@social');
        Route::get('analytics', 'Admin\AdminConfiguracoesController@analytics');
    });

    Route::get('ajuda', 'Admin\AdminController@ajuda');
});
10
Caio Kawasaki

Le contrôleur n'est pas le bon endroit pour vérifier si un utilisateur est authentifié ou non. Vous devez utiliser un middleware pour cela. Pour obtenir des informations sur ce qu'est un middleware, vérifiez ici

Voyons comment vous pouvez utiliser le middleware auth par défaut de Laravel à cet effet:

Tout d'abord, débarrassez-vous de votre AdminBaseController et utilisez uniquement AdminController

Ensuite, vous devez vérifier que le middleware auth est activé dans le fichier app\Http\Kernel.php

Vous devriez avoir la ligne:

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,

Cela signifie que le middleware est actif et utilisable pour vos itinéraires.

Passons maintenant à l'intérieur de la classe middleware dans app\Http\Middleware\Authenticate.php pour spécifier le comportement du middleware:

//this method will be triggered before your controller constructor
public function handle($request, Closure $next)
{
    //check here if the user is authenticated
    if ( ! $this->auth->user() )
    {
        // here you should redirect to login 
    }

    return $next($request);
}

Maintenant, la seule chose qui reste à faire est de décider pour quelles routes vous devez appliquer le middleware. Supposons que vous ayez deux routes que vous souhaitez n'être accessibles qu'à partir d'utilisateurs authentifiés, vous devez spécifier d'utiliser le middleware pour ces deux routes de cette manière:

Route::group( ['middleware' => 'auth' ], function()
{
    Route::get('admin/index', 'AdminController@index');
    Route::get('admin/ajuda', 'AdminController@ajuda');
});
14
Moppo

Utilisez un middleware à cet effet, puis dans le constructeur du contrôleur, utilisez-le comme dans l'exemple ci-dessous.

public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}

Et puis vous devez sécuriser les itinéraires où vous voulez que l'utilisateur soit connecté pour y accéder.

Route::group(['middleware' => 'auth'], function() {
      Route::get('/dashboard', 'DashboardController@index');
});
3
Denis

Dans Laravel 5.5, un utilisateur non authentifié provoquera le middleware Authenticate pour lever une exception AuthenticationException.

protected function authenticate(array $guards)
{
 if (empty($guards))
 {
  return $this->auth->authenticate();
 }
 foreach ($guards as $guard) {
  if ($this->auth->guard($guard)->check()) {
      return $this->auth->shouldUse($guard);
  }
 }
 throw new AuthenticationException('Unauthenticated.', $guards);
}

Cela sera détecté par la classe app/Exceptions/Handler qui appellera sa méthode render qui est responsable de la conversion d'une exception donnée en réponse HTTP.

public function render($request, Exception $exception)
{
 return parent::render($request, $exception);
}

App/Exceptions/Handler étend "Illuminate\Foundation\Exceptions\Handler", situé dans "/ vendor/laravel/src/Illuminate/Foundation/Exceptions/Handler". Il a sa propre méthode de rendu. Dans cette méthode de rendu, il y a un if else déclaration qui dit.

elseif ($e instanceof AuthenticationException)
{
 return $this->unauthenticated($request, $e);
}

Ci-dessous se trouve la méthode "non authentifiée" qui est appelée par ce qui précède dans la même classe

protected function unauthenticated($request, AuthenticationException $exception)
{
  return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}

dans cette méthode est l'endroit où vous redirigez un utilisateur non authentifié.

Pour autant que je puisse voir, c'est ce qui se passe dans les coulisses.

2
Bruce Tong

La façon dont vous étendez et exécutez le restricteur parent est correcte, mais le retour d'une vue pour l'exécuter n'est possible qu'à partir des routes, des actions du contrôleur et des filtres. Sinon, vous devez appeler send ().

pour vous, je pense que vous devriez utiliser avant pour le filtre http://laravel.com/docs/4.2/routing#route-filters

0
zt1983811