Laravel France

Redirection après connexion de mon utilisateur

Avatar de annesophie05
annesophie05

Bonjour , J'essaye de rediriger mes pages après une connexion de mon utilisateur.( l'utilisateur est soit admin , agent ou user)

j'ai créé mes 3 vues admin user agent, 3 controllers avec des méthodes index qui renvoient les vues admin, user, agent.

j'ai créé 3 middlewares , j'ai inscrit les routes des middlewares dans le fichier kernel.php

j'ai rajouté du code dans les middlewares et dans le controller LoginController .

j'ai suivi un tuto et au debut de ce tuto il passe la clé etrangère en null. Pourquoi ?

Car moi j'avais déjà créé mes tables et ma clé étrangère avant de tenter une redirection et j'ai aussi créé 3 comptes avec les fichiers seeders qui prennent en compte cette clé.

Dans le code que j'ai ajouté dans les middlewares , la clé étrangère ( idstatut ) est justement surligné et quand je passe mon curseur dessus cela indique : idstatut not found in illuminate\contracts\auth\autenticatable \null.

merci de vos réponses

Avatar de Bilal
Bilal

Bonjour anne, peux-tu partager tes routes et tes middlewares afin de voir ce qui ne va as

Avatar de annesophie05
annesophie05

voici le middleware admin

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class admin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Auth::check()) {
            return redirect()->route('login');
        }

        //idstatut 1= admin
        if (Auth::user()->idstatut == 1) {
            return $next($request);
        }


        //idstatut 2= agent
        if (Auth::user()->idstatut == 1) {
            return redirect()->route('agent');
        }


        //idstatut 3= user
        if (Auth::user()->idstatut == 1) {
            return redirect()->route('user');
        }


    }
Avatar de annesophie05
annesophie05

middleware agent

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class agent
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(!Auth::check())
        {
            return redirect()->route('login');
        }

        //idstatut 1= admin
        if(Auth::user()->idstatut ==1)
        {
            return  redirect()->route('admin');
        }


        //idstatut 2= agent
        if(Auth::user()->idstatut ==1)
        {
            return $next($request);

        }


        //idstatut 3= user
        if(Auth::user()->idstatut ==1)
        {
            return  redirect()->route('user');
        }
    }
}
Avatar de annesophie05
annesophie05

le middleware user et mes routes

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class user
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(!Auth::check())
        {
            return redirect()->route('login');
        }

        //idstatut 1= admin
        if(Auth::user()->idstatut ==1)
        {
            return  redirect()->route('admin');
        }


        //idstatut 2= agent
        if(Auth::user()->idstatut ==1)
        {
            return  redirect()->route('agent');
        }


        //idstatut 3= user
        if(Auth::user()->idstatut ==1)
        {
            return $next($request);

        }
    }
}
Avatar de annesophie05
annesophie05

les routes

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Route::get('/admin', 'AdminController@index')->name('admin')->middleware('admin');
Route::get('/agent', 'AgentController@index')->name('agent')->middleware('agent');
Route::get('/user', 'UserController@index')->name('user')->middleware('user');
Avatar de Bilal
Bilal

Le problème avec tes routes, c'est que lors de la connexion des utilisateurs, la redirection se fait grace aux routes définies par helper class Auth::routes();

pour afficher toutes les routes générées par cette classe dans la ligne de commande : php artisan route:list

Avatar de annesophie05
annesophie05
--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------+
|        | GET|HEAD | /                      |                  | Closure                                                                | web        |
|        | GET|HEAD | admin                  | admin            | App\Http\Controllers\AdminController@index                             | web        |
|        |          |                        |                  |                                                                        | admin      |
|        | GET|HEAD | agent                  | agent            | App\Http\Controllers\AgentController@index                             | web        |
|        |          |                        |                  |                                                                        | agent      |
|        | GET|HEAD | api/user               |                  | Closure                                                                | api        |
|        |          |                        |                  |                                                                        | auth:api   |
|        | GET|HEAD | home                   | home             | App\Http\Controllers\HomeController@index                              | web        |
|        |          |                        |                  |                                                                        | auth       |
|        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web        |
|        |          |                        |                  |                                                                        | guest      |
|        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web        |
|        |          |                        |                  |                                                                        | guest      |
|        | POST     | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web        |
|        | GET|HEAD | password/confirm       | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    | web        |
|        |          |                        |                  |                                                                        | auth       |
|        | POST     | password/confirm       |                  | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            | web        |
|        |          |                        |                  |                                                                        | auth       |
|        | POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web        |
|        | POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web        |
|        | GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web        |
|        | GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web        |
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web        |
|        |          |                        |                  |                                                                        | guest      |
|        | GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web        |
|        |          |                        |                  |                                                                        | guest      |
|        | GET|HEAD | user                   | user             | App\Http\Controllers\UserController@index                              | web        |
|        |          |                        |                  |                                                                        | user
Avatar de Bilal
Bilal

Il faut supprimer cette ligne protected $redirectTo = RouteServiceProvider::HOME dans le LoginController et y ajouter cette fonction

    public function authenticated(Request $request, $user)
    {

        if($user->idStatut == 1 ) {
            return redirect()->route('admin');
        }elseif($user->idStatut == 2') {
            return redirect()->route('agent');
        }elseif($user->idStatut == 3') {
            return redirect()->route('user');
        }else {
            return redirect()->route('home');
        }
    }

dans le fichier web.php. Il faut placer les routes au-dessus de Auth::routes();

Avatar de annesophie05
annesophie05

Bonjour ok je vais tester cela

Avatar de annesophie05
annesophie05

J'ai tester ça ne marche pas

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

C'est moi ou tes 3 middleware sont identiques ? Ce se serait pas plus simple de laisser le middleware auth et de faire tes redirects dans ton controller login (c'est un peu ce qu'a proposé Bilal, mais en virant complètement tes middleware inutiles).

Pour savoir vraiment comment faire, il nous faudrait savoir comment tu as géré la connexion (laravel/ui ou autre) et aussi ta version de Laravel peut être utile.

Etrange que la propotision de Bilal n'ait pas fonctionné...

Jette un oeil ici ==> https://laravel.com/docs/7.x/authentication partie Redirecting Unauthenticated Users

Avatar de Bilal
Bilal

Normalement ça devrait marcher. Par contre, elle peut garder les différents middlewares dans le cas où elle veut regrouper les différentes route pour chaque utilisateur, mais en les modifiant. Par exemple pour l'admin

class Admin
{

    public function handle($request, Closure $next)
    {
       if (Auth::user()->idstatut == 1) {
            return $next($request);
        }

        return back();
    }
}

Et pour les routes :

Route::group(['prefix' => 'compte', "middleware" =>['auth']], function() {
        Route::group(['prefix' => 'admin',"middleware" =>['admin']], function() {
            //routes admin
        }
        Route::group(['prefix' => 'agent',"middleware" =>['agent']], function() {
            //routes agent
        }
        Route::group(['prefix' => 'user',"middleware" =>['user']], function() {
            //routes user
        }
}
Avatar de annesophie05
annesophie05

re bonjour Merci pour vos réponses

c'est bon mon code fonctionne le seul souci c est que je ne sais pas pourquoi . j'ai du mal ecrite une route ou un truc du genre . En rechanche je retesterai le code de bilah car si c 'etait moi qui est mal écrit une route cela devrait fonctionner aussi . Je suis sur laravel 7 et j'utilise le composant auth laravel/ui avec bootstrap

Vous ne pouvez pas répondre à ce sujet.