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 :

Annotation @Security synthaxe


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Annotation @Security synthaxe
    Bonjour j'aimerai que seulement l'utilisateur propriétaire du profil puisse avoir l'accès à l' edit de son profil mais j'ai visiblement un problème de syntaxe dans l annotation @Security ce que je comprend tout à fait mais je ne vois pas comment faire

    Code erreur :

    Unexpected token "operator" of value ">" around position 34 for expression `is_granted('ROLE_USER') and user->getId === 'id'`.

    Ma fonction avec annotation

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        /**
         * @Route("/user/{id}/edit", name="user_edit", methods={"GET","POST"}, requirements={"id"="\d+"})
         * @Security("is_granted('ROLE_USER') and user->getId === 'id'", message="Ce profil ne vous appartient pas, vous ne pouvez pas le modifier.")
         */
        public function editUser(Request $request, UserRepository $userrepository, $id)

  2. #2
    Membre à l'essai
    Pour plus de précisions sur le ligne du @security j'aimerai que le user.id (et non pas le user->getId() comme j'ai marqué) soit égal à l'id de la route pour avec accès à l'edit

  3. #3
    Membre régulier
    Bonjour,

    Voici un exemple qui fonctionne à condition d'utiliser ParamConverter également :

    Dans ton annotation :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Route("/edit/{user_id}", name="user_edit")
    @ParamConverter("user", options={"mapping": {"user_id": "id"}})
    @Security("user.isAllowed(user)")
    public function editUser(User $user)
        {


    et dans l'entité User :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function isAllowed(User $user = null)
        {
            return $user && $user->getGetId() === $this->getId();
        }

  4. #4
    Futur Membre du Club
    Merci PhiMau pour ta réponse je vais tester ça ce soir

  5. #5
    Membre à l'essai
    Alors j'ai adapté mon code

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        /**
         * @Route("/user/{id}/edit", name="user_edit", methods={"GET","POST"}, requirements={"id"="\d+"})
         * @ParamConverter("user", options={"mapping": {"user_id": "id"}})
         * @Security("is_granted('ROLE_USER') and user.isAllowed(user)", message="Ce profil ne vous appartient pas, vous ne pouvez pas le modifier.")
         */
        public function editUser(Request $request, UserRepository $userrepository, $id)


    tout en rajoutant la function dans mon entité user

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public function isAllowed(User $user = null)
        {
            return $user && $user->getId() === $this->getId();
        }


    Mais malheureusement ça ne restreint pas l'accès à l'édit et je n'ai pas de messages d'erreurs je vois pas où je me suis trompé

  6. #6
    Membre régulier
    Oui sorry je t'ai envoyé mon code sans l'adapter au tiens

    Euh ça devrait fonctionner pourtant mais on dirait que t'as une erreur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
            return $user && $user->getGetId() === $this->getId();


    normalement c'est :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
            return $user && $user->getId() === $this->getId();


    Peut-être dans un premier temps si ça fonctionne toujours pas, retire ton IS_GRANTED de l'annotation pour tester étape par étape.

    Et sinon place un die and dump au début de ta méthode isAllowed, uniquement dans le but de vérifier quels sont les id et tenter de débuguer :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    dd($user->getId() . ' - ' . $this->getId();

  7. #7
    Membre à l'essai
    Aucun soucis PhiMau c'est à moi d'adapter mon code de toute façon t es déjà bien gentils de m'aider je vais tenter un dumper et enlevé mon IS_GRANTED voir si ça règle me problème.

  8. #8
    Membre à l'essai
    Donc j'ai enlevé IS_GRANTED et j'ai fait un dd() dans l'entité user et je récupère bien ce qui est attendu vu que je suis connecté avec le user aillant l'id 1 cad :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    User.php on line 116:
    "1 - 1"


    et niveau de mon controller j'ai ça du coups :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /**
         * @Route("/user/{id}/edit", name="user_edit", methods={"GET","POST"}, requirements={"id"="\d+"})
         * @ParamConverter("user", options={"mapping": {"user_id": "id"}})
         * @Security("user.isAllowed(user)", message="Ce profil ne vous appartient pas, vous ne pouvez pas le modifier.")
         */
        public function editUser(Request $request, User $userentity, UserRepository $userrepository, $id)


    Mais j'ai toujours accès à une édition de profil qui n'appartient pas à l'utilisateur

  9. #9
    Membre régulier
    Si le résultat de ton var_dump est "1 - 1", alors c'est normal que tu accèdes à la page je pense...

    Ca veut dire que l'id du User que tu essayes de modifier est le même id que le user actif (toi).
    Le forbidden se déclenche si l'id est différent.

    le "1 - 1" s'affiche lorsque tu accèdes à un profil différent ?

  10. #10
    Futur Membre du Club
    Oui j' ai sais que c est normal d avoir accès à l id 1 si je suis connecté en utilisateur 1 j ai fait le test en mettant 2 dans l URL mais ça changeait rien malheureusement. Je referai le test avec le dump en rentrant ce soir. Mais pour l instant que je sois connecté en utilisateur 1 ou 2 j' ai accès à l édition des 2 profils.

  11. #11
    Membre à l'essai
    Donc en remettant le dump dans dans mon entité user il me trouve bien 1 pour l'utilisateur 1 - 1 et 2 - 2 pour l'utilisateur 2 donc la fonction récupère bien le l'id de l'utilisateur connecté. Je suppose que le problème doit venir du controller.

###raw>template_hook.ano_emploi###