首页 > 解决方案 > Symfony 4 - 如何在控制器中验证我的令牌?

问题描述

在我的控制器的一个函数中,我初始化了一个我将参数传递给视图的表单。然后表单必须重定向到我的控制器的另一个操作,如下所示:

控制器:索引()

/**
     * @Route("/validation/absences", name="validation_index")
     */
    public function index(PaginatorInterface $paginator, Request $request, AbsenceService $absenceService)
    {
        $refusAbsence = new Absence();
        $formRefus = $this->createForm(RefusAbsenceType::class, $refusAbsence);
        $formRefus->handleRequest($request);
        return $this->render('validation/index.html.twig', [

            "formRefus" => $formRefus->createView(),
        ]);

我的表单操作转到此功能:

 /**
     * Refuser une demande d'absence
     * 
     * @Route("validation/absences/refuser/{id}", name="validation_refuser")
     *
     * @param Absence $absence
     * @return void
     */
    public function refuser(Request $request, Absence $absence)
    {
        $token = $request->get('refus_absence')['_token'];

        if (!$this->isCsrfTokenValid('refus_absence__token', $token)) {
            throw new \Symfony\Component\Security\Core\Exception\AccessDeniedException('Accès interdit');
        }

        $commentaire = $request->get('refus_absence')['commentaire'];
        dd($commentaire);
    }

我通过请求取回了我的令牌,但我无法对其进行验证。我仍然有错误。

然而在 Symfony 的文档中,他们说:

if ($this->isCsrfTokenValid('token_id', $submittedToken)) {
        // ... do something, like deleting an object
    }

在我的 HTML 中,我有:

<input type="hidden" id="refus_absence__token" name="refus_absence[_token]" value="7bbockF5tz3r7Ne9f6dQB7Y5YMcwd1QRES4vHrhQEQE">

标签: phpsymfonysecuritycontrollertoken

解决方案


在您的接收功能中,只需重新创建表单:

$form = $this->createForm(RefusAbsenceType::class, new Absence());
$form->handleRequest($request);
// also checks csrf, it is enabled globally, otherwise, recreate parameters
// in the createForm call.
if($form->isSubmitted() && $form->isValid()) { 
    $absence = $form->getData();
    // do whatever ... persist and stuff ...
}

推荐阅读