Laravel 5

Policy inactive

Avatar de Artemis-Lhow
Artemis-Lhow

Bonsoir,

J'ai un soucis avec une policy pourtant toute simple et je ne trouve pas le soucis....

Sur ma page d'accueil j'ai placé :

@can('view', $forum)
    <tr>
        <td>{{ $forum->nom }} <br/> {{ $forum->description }}</td>
        <td>{{ $forum->nb_sujets }}</td>
        <td>{{ $forum->nb_messages }}</td>
        <td>
            @if($forum->Sujet != null)
                {{ $forum->Sujet['nom'] }} <br/> par
                {{ $forum->Sujet->Message->Personnage['nom'] }}
            @else
                Aucun message
            @endif
        </td>
    </tr>
@endcan

Et du côté de ma policy j'ai tout simplement placé un :

public function view(Forum $forum)
{
    return true;
}

Bien évidement ce n'est pas l'utilisation finale... mais même ça ne fonctionne pas T-T

Ma variable forum contient bien un objet App\Model\Forum mais visiblement la policy renvoi false quoi que je fasse... une idée ?

Bonne soriée et d'avance merci pour l'aide,

Posté il y a 1 mois
Avatar de ArnaudY
ArnaudY

Bonsoir,

Si tu es en auto-discovery des policies, il faut respecter la règle de nommage Model+suffixe 'Policy', donc dans ton cas 'ForumPolicy'.
Sinon tu peux enregistrer ta policy : 
Cf: https://laravel.com/docs/6.x/authorization#creating-policies

Cdt,
Posté il y a 1 mois
Avatar de Artemis-Lhow
Artemis-Lhow

Bonsoir,

Merci pour le coup de pouce, malheureusement ça ne change rien...

J'ai bien inclus dans mon AuthServiceProvider le code :

protected $policies = [
        Forum::class => ForumPolicy::class,
 ];

Mais au niveau de ma vue, toujours rien ! J'ai remarqué une erreur grace à la debugbar, la section gate m'affiche 4 erreurs (1 pour chaque ittération de la boucle) avec systématiquement le même contenu :

error
array:4 [▼
  "ability" => "view"
  "result" => null
  "user" => null
  "arguments" => "[0 => Object(App\Model\Forum)]"
]

C'est légérement désespérant ah ah..

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Salut,

Il me semble qu'une méthode dans un policy doit avoir deux arguments dont le premier est le user.

Posté il y a 1 mois
Avatar de Artemis-Lhow
Artemis-Lhow

Bonjour,

J'ai testé l'ajout du paramètre user à la fonction view du policy... sans plus de succès...

Toutefois je me pose une question... dans ma vue je fais :

@can('view', $forum)

Mais comment laravel sait quelle policy utiliser ? Est-ce lié au type d'objet envoyé ? Si j'ai deux policy différentes qui utilisent toutes les deux un argument de type ForumObj... qu'est-ce qui se passe ?

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Salut,

Tu as défini dans ton provider le lien entre la classe Forum et ta policy, donc Laravel la trouve facilement. Evidemment ta variable $forum doit être une instance de cette classe.

Posté il y a 1 mois
Avatar de Artemis-Lhow
Artemis-Lhow

En effet...

Bon celà dis, ça n'explique pas pourquoi rien ne fonctionne...

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Je serais quand même curieux de voir ce qui arrive dans la méthode :

public function view(User $user, Forum $forum)
{
   dd($user); // et aussi dd($forum);
    return true;
}
Posté il y a 1 mois
Avatar de Artemis-Lhow
Artemis-Lhow

Aloors... j'ai une bonne et une mauvaise nouvelle...

La bonne nouvelle c'est que lorsqu'un utilisateur est connecté, la policy est bien appliquée !

La mauvaise nouvelle, c'est qu'elle est censée fonctionner également si l'utilisateur n'est pas connecté...

Le soucis c'est qu'avec le système actuel la policy renvoi automatiquement false si l'utilisateur n'est pas connecté...

-_-'

Du coup... une alternative ?

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Regarde ici.

Posté il y a 1 mois
Avatar de Artemis-Lhow
Artemis-Lhow

Super, merci beaucoup pour votre aide !

Dernière question après je ne vous embête plus :D

Lorsque la policy retourne false, c'est considéré comme une erreur par la debugbar... normal ?

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Elle ne devrait pas considérer ça comme une erreur.

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.