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