Bonjour,

Je suis en train de développer un site sous Laravel pour m'entrainer au framework, et dans ce site, les utilisateurs auront un "rôle", qui définira les limites de ce qu'ils peuvent faire sur le site (invité, commercial, admin...), pour ça j'ai mis un champs "rôle" dans ma table User et j'y ai attribué un chiffre.
Maintenant, pour faire un test, j'ai voulu faire le code suivant :

@if (Auth::guest())

          /* Affichage de la navbar avec le formulaire d'authentification

         @else

              @if($role->role == 1)

              <a class="navbar-brand navbar-right" href="{{ url('/logout') }}">Logout</a>

              @endif

              <a class="navbar-brand navbar-right" href="{{ url('/logout') }}">Logout1</a>

          @endif 

L'utilisateur que je connecte à pour role "0", du coup à la connexion je voudrais qu'il n'ai que le "Logout1" d'affiché.
J'ai essayé avec ces lignes de code dans le AuthController

    public function login(Request $request)
    {
        $this->validate($request, [
            'name'=>'required',
            'password'=>'required',
        ]);

        $user = User::where('name', $request->get('name'))->first();
        $role = User::get(); //ici

        if($user && Hash::check($request->get('password'), $user->password))
        {
            Auth::login($user, $request->has('remember'));
            return redirect()->intended($this->redirectPath('acceuil'))->with(compact('role'), 'success', 'Vous êtes à présent connecté.'); //Et le compact('role')

        }

        return redirect('acceuil')
            ->withInput($request->only('name', 'remember'))
            ->with('error', 'Indentifiants incorrects !');
    }

Cependant, j'ai juste une erreur de "undefinable variable : role" lorsque je fais la connexion.

ça semble lié au fait que je vais sur ma page "acceuil" qui elle, ne récupère pas les données du User::get(), ou du moins j'ai l'impression que c'est ça ^^

Du coup, avez vous une idée de pourquoi il ne récupère pas ma variable role ?

2 réponses


Axis
Réponse acceptée

Il ne recupere pas ta variable role car tu ne la renvoie pas dans ta vue...

Remplace @if($role->role == 1) par @if(Auth::user()->role == 1)

Je te conseille d'utiliser :

  • les policies (on définit les règle d'authorisation dans ce fichier policies)
  • et "authorize" dans les méthodes de ton controller que tu veux protéger en accès par un rôle

D'abord un exemple, puis la source de la doc tout en bas.

Exemple :

1/ DANS APP/POLICIES/Nom_de_ton_modelPolicy.phparoundici dans l'exemple APP/POLICIES/ActivityPolicy.php

<?php

namespace App\Policies;

use App\User;
use App\Activity;
use Illuminate\Auth\Access\HandlesAuthorization;

class ActivityPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */

     // la fonction before est lancée avant toute autre fonctions policies.
     // ici si le role de l'utilisateur est admin alors on retourne true
     // Ceci lui autorise le droit pour toutes les actions (destroy, update, store)
     public function before($user)
     {
        if ($user->role === 'admin') {
            return true;
        }
    }

    // Règle pour les user : Seul le créateur du lieu peut supprimer un lieu
    public function update(User $user, Activity $activity)
    {
        return $user->id === $activity->user_id;
    }

    // Règle pour les user : Seul le créateur du lieu peut supprimer un lieu
    public function edit(User $user, Activity $activity)
    {
      return $user->id === $activity->user_id;
    }

    // Règle pour les user : Seul le créateur de l'activité peut supprimer une activité
    public function destroy(User $user, Activity $activity)
    {
        return $user->id === $activity->user_id;
    }

    public function __construct()
    {
        //
    }
}

2/ Dans ton controller - (Ici activitiesController.php) tu peux utiliser la méthode authorize() pour lui dire que cette action suit les règles précedemment définies

class ActivitiesController extends Controller
{
 // .... 
 public function edit(Activity $activity) {
    $this->authorize('edit', $activity);
    return view('activities.edit', compact('activity'));
  }

 }

3/ Et si tu le veux tu peux aussi afficher des éléments ou non dans la vue en suivant les policies

Conclusion : Cette façon de gérer les rôles est pour moi la plus appropriée car elle se fait dans un fichier unique, le modèle lui s'occuppant plutôt des données et de leur validation.

C'est ma façon de faire sur LARAVEL après avoir analysé toutes les façons de le faire.

Source : https://laravel.com/docs/5.3/authorization