0
votes

Comment puis-je empêcher l'utilisateur d'accéder à la page de connexion après s'être connecté avec Laravel Guards?

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

});


4 commentaires

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


3 Réponses :


2
votes

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'


3 commentaires

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



0
votes

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


10 commentaires

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



0
votes

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


0 commentaires