IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Changement pour les restriction depuis la 6.2


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 189
    Points : 79
    Points
    79
    Par défaut Changement pour les restriction depuis la 6.2
    Salut !
    Je suis en plein apprentissage de SF depuis quelques semaine et je bloque sur le passage de la restriction car le cours que je suis est à la 6.0,or depuis il y a eu quelques changement, notamment au niveau des restrictions avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #[IsGranted()] et #[Security()]
    , mais ce dernier semble être obsolète !

    J'ai évidement regardé la doc, mais je ne trouve pas la solution qui peut être la plus proche à mon cas de figure

    Dans le controller de mon entité, j'ai pas trop de souci pour le "Create" et le "Read" je met juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #[IsGranted('ROLE_USER')]
    avant les fonctions, mais par contre pour le "Update" à la 6.0 on pouvait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #[Security("is_granted('ROLE_USER') and user === monEntite.getUser()")]
    mais cela ne marche plus !

    J'ai évidement cherché sur le net et testé plein de chose notamment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #[IsGranted("('ROLE_USER') and user === monEntité.getUser()")]
    tout bêtement mais j'ai un message d'erreur comme quoi l'accès est refusé alors que ça ne devrait pas.

    Je pense que je suis pas loin mais je crois qu'il me manque un détail ! Bref merci pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Bonjour,

    Tu peux définir une Expression pour l'attribut #[IsGranted()] : https://symfony.com/doc/6.4/security/expressions.html
    Il faudra spécifier ton entité en 2ème paramètre de l'attribut afin de pouvoir utiliser la variable correspondante object dans l'expression.

    Sinon tu peux faire la vérification dans ton contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if ($entity->getUser() !== $this->getUser()) {
            throw $this->createAccessDeniedException();
        }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 189
    Points : 79
    Points
    79
    Par défaut
    Merci pour ta réponse rapide !

    Alors j'ai essayé avec la condition et ça marche super merci

    Après c'est vrai que dans l'absolue je voulais utiliser IsGranted !
    Avant de poser ma question, j'avais aussi essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #[IsGranted(
             new Expression("is_granted('ROLE_USER') and user === subject.getUser()"),
             subject:'entity',)]
    )

    Mais cette version me met une erreur 500 dans le navigateur
    J'ai aussi essayé ça suite à ton lien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #[IsGranted(
            attribute:new Expression('user === subject'),
            subject: new Expression('args["entity"].getAuthor()')
        )]
    Mais j'ai la même erreur 500
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Symfony\Component\Security\Http\Attribute\IsGranted::__construct(): Argument #1 ($attribute) must be of type 
    Symfony\Component\ExpressionLanguage\Expression|string, 
    Symfony\Component\Validator\Constraints\Expression given, called in E:\SYMFONY\sym
    J'ai p'tet pas compris la doc ou mal adapté le code :/

  4. #4
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Ton premier extrait semble correct, il faudrait voir le message d'erreur 500 que tu as avec ce code.
    Le paramètre de ton contrôleur correspondant à l'entité se nomme vraiment "entity" ?
    Ton entité possède une méthode getUser() ou getAuthor() ?

    En reprenant pour exemple le BlogController de Symfony Demo avec une entité Post qui possède une méthode getAuthor() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        #[Route('/posts/{slug}', name: 'blog_post', requirements: ['slug' => Requirement::ASCII_SLUG], methods: ['GET'])]
        #[IsGranted(new Expression('is_granted("ROLE_USER") and user == object.getAuthor()'), 'post')]
        public function postShow(Post $post): Response
        {
            // ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 189
    Points : 79
    Points
    79
    Par défaut
    L'erreur 500 est celle que j'ai mis dans mon précédent message juste à la fin, à chaque fois ca me parle de "__construct()" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Symfony\Component\Security\Http\Attribute\IsGranted::__construct(): Argument #1 ($attribute) must be of type 
    Symfony\Component\ExpressionLanguage\Expression|string, 
    Symfony\Component\Validator\Constraints\Expression given, called in E:\SYMFONY\sym
    Mais sinon, non effectivement j'ai mis entity à titre d'exemple et cet entité posède effectivement un getUser mais pas de getAuthor (d'ailleurs je viens de voir que dans mon précédent message j'avais mis getAuthor au lieu de getUser)

    Donc pour résumé voici mes essais infructueux avec le vrai nom de mon entité qui donne la même erreur 500 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        #[IsGranted(
            new Expression("is_granted('ROLE_USER') and user === subject.getUser()"),
            subject:'ingredient',)]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        #[IsGranted(
            attribute:new Expression('user === subject'),
            subject: new Expression('args["ingredient"].getUser()')
        )]
    Et voici une partie de mon entité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        #[ORM\ManyToOne(inversedBy: 'ingredients')]
        #[ORM\JoinColumn(nullable: false)]
        private ?User $user = null;
     
        public function getUser(): ?User{  
           return $this->user;
        }
     
        public function setUser(?User $user): static{
            $this->user = $user;
            return $this;
        }

  6. #6
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Argument #1 ($attribute) must be of type Symfony\Component\ExpressionLanguage\Expression, Symfony\Component\Validator\Constraints\Expression given
    Tu as importé la mauvaise classe Expression : use Symfony\Component\ExpressionLanguage\Expression; à la place de use Symfony\Component\Validator\Constraints\Expression;

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 189
    Points : 79
    Points
    79
    Par défaut
    Haaaaaaa oui c'était ça le souci !

    C'est d'ailleurs l'inverse

    j'avais use Symfony\Component\Validator\Constraints\Expression; au lieu de l'autre !

    Un grand merci en tout cas pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/12/2015, 16h11
  2. Réponses: 6
    Dernier message: 22/08/2014, 15h57
  3. Réponses: 1
    Dernier message: 06/03/2007, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo