J'ai lancé un nouveau projet Laravel 5.2 en utilisant laravel new MyApp
et ajouté une authentification via php artisan make:auth
. Ceci est destiné à être un site Web réservé aux membres, où le premier utilisateur est créé, et crée le reste (pas de création manuelle d'utilisateur/réinitialisation du mot de passe/etc).
Ce sont les routes que j'ai actuellement définies:
Route::group(['middleware' => 'web'], function () {
// Authentication Routes...
Route::get( 'user/login', ['as' => 'user.login', 'uses' => 'Auth\AuthController@showLoginForm']);
Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\AuthController@login' ]);
Route::group(['middleware' => 'auth'], function() {
// Authenticated user routes
Route::get( '/', ['as'=>'home', 'uses'=> 'HomeController@index']);
Route::get( 'user/{uid?}', ['as' => 'user.profile', 'uses' => 'Auth\AuthController@profile' ]);
Route::get( 'user/logout', ['as' => 'user.logout', 'uses' => 'Auth\AuthController@logout' ]);
Route::get( '/user/add', ['as' => 'user.add', 'uses' => 'Auth\AuthController@showAddUser']);
[...]
});
});
Je peux me connecter très bien, mais je rencontre un comportement très "funky" - lorsque j'essaie de me déconnecter (via la méthode logout
intégrée créée par artisan), la page effectue une redirection 302 vers domicile, toujours connecté.
De plus, alors que presque toutes les pages (non répertoriées ici) fonctionnent comme prévu, user.add génère également un 302 pour la page d'accueil.
Notez que la page d'accueil est déclarée à AuthController en tant que $redirectTo
, si cela fait une différence.
J'ai découvert les redirections via la barre de débogage. Une idée sur quoi chercher?
Après plusieurs heures de coupe de cheveux, j'ai trouvé ma réponse - et c'est idiot.
Le problème est que l'itinéraire user.profile
a un chemin user/{uid?}
et qu'il correspond à la fois à user/logout
et à user/add
en tant que chemins.
Etant avant les autres, et n'ayant pas de regex ou similaire, il a géré la route.
Je ne sais toujours pas pourquoi un 302 a été généré pour que page, mais j'ai constaté que le fait de le déplacer hors de la variable AuthController
dans la variable UserController
(où il devrait se trouver depuis le début) corrigeait le comportement.
Ainsi, mes itinéraires (modifiés et de travail) ressemblent maintenant à ceci:
Route::group(['middleware' => 'web'], function () {
// Authentication Routes...
Route::get( 'user/login', ['as' => 'user.login', 'uses' => 'Auth\AuthController@showLoginForm']);
Route::post('user/login', ['as' => 'user.doLogin', 'uses' => 'Auth\AuthController@login' ]);
Route::group(['middleware' => 'auth'], function() {
// Authenticated user routes
Route::get( '/', ['as'=>'home', 'uses'=> 'HomeController@index']);
Route::get( '/home', ['as'=>'home', 'uses'=> 'HomeController@home']);
Route::get( 'user/logout', ['as' => 'user.logout', 'uses' => 'Auth\AuthController@logout' ]);
// *** Added /profile/ here to prevent matching with other routes ****
Route::get( 'user/profile/{uid?}', ['as' => 'user.profile', 'uses' => 'UserController@profile' ]);
Route::get( '/user/add', ['as' => 'user.add', 'uses' => 'UserController@showAddUser']);
[...]
});
});
J'ai rencontré un problème avec 302 redirections lors de l'envoi de requêtes ajax. La solution dans ce cas était de ne pas oublier d'inclure le jeton CSRF.
Voir les documents Laravel 5.4 ici: https://laravel.com/docs/5.4/csrf
La page de redirection par défaut après la déconnexion est probablement home
et semble ne pas avoir home
dans votre itinéraire web
. Essayez le code ci-dessous dans votre AuthController.php
use AuthenticatesAndRegistersUsers, ThrottlesLogins; // after this line
$redirectAfterLogout = 'login' // add this line
Cela vous redirigera vers la page login
après la déconnexion. Vous pouvez le changer pour n’importe quel itinéraire si vous le souhaitez. J'ai utilisé login
comme exemple.
OU
Vous pouvez changer de route après la déconnexion dans \vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
public function logout()
{
Auth::logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : 'login');
}
J'ai changé la route par défaut en login
. Si vous n'avez pas $redirectAfterLogout
dans votre AuthController.php
, il cherchera ici le chemin de redirection. Je ne suggère pas aux gens d'éditer ici, c'est un peu difficile à coder.
J'ai eu le même problème et je l'ai résolu en ajoutant l'en-tête avec accept: 'application/json'. Et je pense avoir vérifié le code source avant ce qui indique que si vous n’ajoutez pas cela, il risque d’être redirigé lorsque vous utilisez le middleware auth. Mais je ne suis pas sûr que ce soit le cas et je ne peux pas me rappeler où j'ai trouvé cela.
J'ai eu ce problème et il s'est avéré que j'avais un itinéraire: rediriger à l'intérieur de mon contrôleur ajax ., Ce qui n'a pas de sens car il est évident que nous devons renvoyer ajax mais je retournais un itinéraire!