Je construis un projet avec Laravel. Tout va bien avec mes codes, juste au moment où l'utilisateur est connecté, il peut accéder au tableau de bord, mais le problème est que lorsque j'appuie sur l'URL de connexion, il revient et affiche à nouveau la page du formulaire de connexion lorsque j'appuie sur l'url du tableau de bord. me montrant le tableau de bord.
Comme nous savons que sur Facebook après nous être connectés, nous ne pouvons plus accéder à la page de connexion, mais si nous nous déconnectons, nous pouvons voir, donc je veux cette même fonctionnalité dans mon projet. Voici ci-dessous mes codes dans la mesure où j'ai fait,
Routes
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'admin' => \App\Http\Middleware\Admin::class, ];
Contrôleur
public function handle($request, Closure $next) { if(!Auth::guard('admin')->check()){ return redirect('/admin'); } return $next($request); }
Intergiciel
public function login(Request $request){ if($request->isMethod('post')){ $data = $request->all(); // echo "<pre>"; // print_r($data); // die; $this->validate($request,[ 'email'=>'required', 'password'=>'required', ], ); if(Auth::guard('admin')->attempt(['email' => $data['email'], 'password' => $data['password']])){ return redirect('admin/dashboard'); }else{ // $request->session()->flash('error', 'Invalid email or password'); Session::flash('error','Invalid email or password'); return redirect()->back(); } } return view('admin.admin_login'); } public function logout(){ Auth::guard('admin')->logout(); return redirect('/admin'); }
Kernel.php
Route::prefix('/admin')->namespace('Admin')->group(function(){ // All the Admin Routes Route::match(['get','post'],'/','AdminController@login'); Route::group(['middleware' => 'admin'], function () { Route::get('dashboard','AdminController@dashboard'); Route::get('logout','AdminController@logout'); }); });
3 Réponses :
Attribuez le middleware invité
à toute route que vous ne voulez pas qu'un utilisateur authentifié atteigne. Vous pouvez lui transmettre un nom de garde:
'guest:admin'
Vous pouvez voir Route :: match (['get', 'post'], '/', 'AdminController @ login');
pensez-vous que ce sera l'itinéraire idéal pour le faire
eh bien, il ne devrait probablement pas gérer plusieurs méthodes HTTP, mais oui; toute route que vous ne voulez pas qu'un utilisateur authentifié atteigne, vous utiliserez le middleware guest
, c'est à cela qu'il sert
d'accord, c'est à cela que sert ce middleware, bonne chance
Vous pouvez utiliser cette méthode de route
class AdminController extends Controller { // Define Middleware here like this public function __construct() { $this->middleware('guest:admin')->only('login'); } public function login(Request $request){ if($request->isMethod('post')){ $data = $request->all(); // echo "<pre>"; // print_r($data); // die; $this->validate($request,[ 'email'=>'required', 'password'=>'required', ], ); if(Auth::guard('admin')->attempt(['email' => $data['email'], 'password' => $data['password']])){ return redirect('admin/dashboard'); }else{ // $request->session()->flash('error', 'Invalid email or password'); Session::flash('error','Invalid email or password'); return redirect()->back(); } } return view('admin.admin_login'); } public function logout(){ Auth::guard('admin')->logout(); return redirect('/admin'); } }
Ou utiliser dans un contrôleur comme celui-ci
public function __construct() { $this->middleware('guest:admin')->only('login'); }
ou
public function __construct() { $this->middleware('auth')->only(['edit']); }
Je fais avec votre code
Route::get('/login', function () { // })->middleware('guest:admin');
Avez-vous vu mon itinéraire de connexion Route :: match (['get', 'post'], '/', 'AdminController @ login');
Oui, je les ai vus. Vous pouvez utiliser dans controller dans votre loginController / ** * Créer une nouvelle instance de contrôleur. * * @return void * / public function __construct () {$ this-> middleware ('guest: admin') -> except ('logout'); } fonction protégée guard () {return Auth :: guard ('admin'); }
J'ai remarqué que vous n'utilisez qu'un seul contrôleur pour toutes les routes. Vous pouvez les utiliser comme les contrôleurs d'authentification laravel. Séparez pour chaque méthode. Je les ai utilisés comme ça
Non Cet AdminController est juste pour la connexion. Les résultats sont les mêmes qu'avant
Le problème vient de vos contrôleurs et de vos itinéraires. Je mets à jour la réponse
Avec mes codes, si j'utilise la route de post de connexion dans Route :: group (['middleware' => 'admin'], function () {
cela fonctionne mais je ne veux pas séparer le get et le post car tous mes codes fonctionnent bien
Oui, je vous ai dit que cette chose fonctionne si je sépare le get et le post si les deux sont utilisés, alors comment faire mais merci
Avez-vous une idée de la façon de les faire avec le match
Cela devrait également fonctionner avec match. Obtenez-vous une erreur lorsque vous avez appliqué dans le contrôleur?
Oui, je suis confronté au même problème
créer un middleware spécial pour accéder à la page de connexion et définir un cookie ou créer une session lorsqu'une session ou un cookie existe, la route doit rediriger vers le tableau de bord sinon afficher la page de connexion
comment avez-vous enregistré votre middleware?
Je me suis inscrit à kernel.php
oui, dans ce fichier, il y a de nombreux endroits où vous pouvez l'enregistrer, vous devez indiquer où vous le mettez,
D'accord, je mets à jour mon message