Bonsoir,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je souhaite autoriser des actions (ou en refuser) à l'aide des "Policies" de Laravel. Je créer une "Policy" appelée "TicketPolicy", et je défini la méthode view() qui permet de vérifier qui à le droit de voir une ressource.

public function view(User $user, Ticket $ticket)
    {
        return $user->id === $ticket->user_id;
    }

Logiquement, avec cette méthode, si l'id de l'utilisateur actuellement connecté est équivalent à la colonne user_id de ma table tickets cela retourne true.

Ce que je veux

Je souhaite que l'utilisateur qui a créé le ticket (et celui qui est actuellement connecté) puisse voir son ticket et non qu'il tombe sur une action unauthorized !

Ce que j'obtiens

Lorsque j'appelle la méthode authorize() dans la méthode show() de mon controller, l'action n'est pas authorisée alors que j'ai bien pris la précotion de voir un ticket qui a été créé par l'utilisateur actuellement connecté car dd(auth()->id(), $ticket->user_id); retourne 4 et "4"

La déclaration dans le controller :

public function show($id)
    {
        $ticket = Ticket::find($id);
        $this->authorize('view', $ticket);
        if ($ticket && request()->expectsJson()) {
            return response()->json(new TicketResource($ticket), Response::HTTP_OK);
        } elseif (!$ticket && request()->expectsJson()) {
            return response()->json([Output::MESSAGE => Output::RESOURCE_NOT_FOUND], Response::HTTP_NOT_FOUND);
        } elseif ($ticket && !request()->expectsJson()) {
            return view('tickets.show', compact('ticket'));
        }
        return abort(404);
    }

14 réponses


adrienpsn
Auteur
Réponse acceptée

Lorsque la fonction authorize est appelée, il faut lui passer le modèle en second paramètre ! Dans mon cas : authorize('view', Ticket::class);

Salut !
Quand tu dis retourne 4 et "4", est ce que tu as d'un coté une chaine de caractère et de l'autre un entier ?

yo, si tu mets seulement "==" et pas "===" il se passe quoi? connais tu la différence entre les 2 ? car ton message laisse supposé que un 4 est de type string .
++

En effet les '==' et '===' vérifie tout les deux l'égalité, par contre les '===' vérifie également l'égalité du type, donc si tu as un entier et un string, c'est pas égal par conséquent tu n'auras pas le droit de voir ton ticket :)

Bonjour ! Merci pour vos réponses mais c'est une erreur de ma part d'avoir mis le triple égal ! Après avoir modifié par un double égal, je ne parviens toujours par à voir le ticket en question !

Si tu commente la ligne $this->authorize, ca fonctionne ?

Effectivement oui, j'arrive à y accéder !

Dans ta policie remplace '$user->id' par 'Auth::user()->id'

Cela ne fonctionne toujours pas...

Au cas ou, tu as bien renseigner ta policy dans le AuthServiceProvider ?

Oui oui, sinon l'erreur action unauthorized ne s'afficherait pas

Aah au temps pour moi :p

On est bien d'accord c'est ça :

protected $policies = [
      Ticket::class => TicketPolicy::class
];

Oui c'est ça.