Bonjour,
Je code un système de MP dans le cadre d'un site utilisant Symfony 3.
J'aimerais savoir comment faire pour refuser proprement la'ccès à la page de discussion si l'utilisateur n'est pas participant dans celle-ci, i.e. on n'a pa le droit de lire les MP des autres.
Voici le début de mon contrôleur actuel :
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php class DiscussionController extends BaseController { /** * @Route("/{_locale}/discussions/{id}/{page}", name="discussionShow", defaults={"page"=1}, requirements={"_locale"="%locales%", "id"="\d+", "page"="\d+"}) */ public function showAction(Request $request, Discussion $discu, $page=1) { $this->denyAccessUnlessGranted('ROLE_USER'); $user = $this->getUser(); if (!$discu->isParticipant($user)) $this->denyAccessUnlessGranted('ROLE_ALWAYS_FAIL'); ... } ... } |
Comme le nom l'indique, le rôle ROLE_ALWAYS_FAIL n'existe pas et est juste là parce que je dois bien mettre quelque chose. Dans d'autres classes j'utilise parfois ROLE_NON_EXIST. Ca marche, je me prends bien une erreur 403, mais évidemment, c'est pas vraiment « pro » comme code. C'est étrange que la méthode deny n'existe pas…
J'aurais pu aussi balancer une exception bidon, ou retourner exprès autre chose qu'une Response, mais ça ne fait pas beaucoup plus « pro ».
J'ai trouvé les AccessDecisionManager et les Voter en fouillant dans la doc, mais ça me paraît excessivement lourd et compliqué à mettre en place pour une vérification aussi simple. Est-ce que c'est la seule façon correcte de faire ?
J'ai une autre question Symfony: où est-on supposé placer les classes qui sont là juste pour gérer des données de formulaire ? Les considère-t-on comme des entités même si elles ne sont jamais stockées en base telles quelles ?
Par exemple, toujours pour mon système de MP, j'ai une classe DiscussionNew qui sert juste à être remplie par un formulaire « nouvelle discussion ». Une fois le formulaire de nouveau topic rempli et validé, je crée des entités Discussion et Post à partir de là. C'est ces entités Discussion et Post qui sont stockées en base.
Est-ce que je dois tout de même considérer que c'est une entité, malgré qu'elle n'est jamais persistée telle quelle ?
Est-ce que je m'y prends mal, est-ce que ce n'est pas du tout la bonne façon de faire ?
Voici cette classe :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php class DiscussionNew { /** *@Assert\NotBlank */ protected $text; /** *@Assert\NotBlank */ protected $title; /** *@Assert\NotNull */ protected $dest; public function setRecipient (User $u) { $this->dest=$u; } public function getRecipient () { return $this->dest; } public function setText ($text) { $this->text = $text; return $this; } public function getText () { return $this->text; } public function setTitle ($title) { $this->title = $title; return $this; } public function getTitle () { return $this->title; } } |
ET extrait du contrôleur qui récupère le formulaire :
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $d = new \AppBundle\Entity\DiscussionNew(); $d->setRecipient($recipient); $form = $this->createForm(\AppBundle\Form\DiscussionNewForm::class, $d); $form->handleRequest($request); if ($form->isValid()) { ... $m = $this->getDoctrine()->getManager(); $m->persist($discussion); $m->persist($post); $m->flush(); return $this->redirectToRoute('discussionShow', array('id'=>$discussion->getId(), '_locale'=>$request->getLocale())); } |
Merci pour vos réponses !
Edit: ah ben désolé, on dirait que la coloration syntaxique pour PHP de fonctionne pas…