Problème avec les "policies"

Par adrienpsn, il y a 7 ans


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

Aashan, il y a 7 ans

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 ?

atomicpunkk, il y a 7 ans

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 .
++

Aashan, il y a 7 ans

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 :)

adrienpsn, il y a 7 ans

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 !

Aashan, il y a 7 ans

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

adrienpsn, il y a 7 ans

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

Aashan, il y a 7 ans

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

adrienpsn, il y a 7 ans

Cela ne fonctionne toujours pas...

Aashan, il y a 7 ans

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

adrienpsn, il y a 7 ans

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

Aashan, il y a 7 ans

Aah au temps pour moi :p

adrienpsn, il y a 7 ans

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

protected $policies = [ Ticket::class => TicketPolicy::class ];
Aashan, il y a 7 ans

Oui c'est ça.

adrienpsn, il y a 7 ans

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