首页 > 解决方案 > Symfony 2 在用户接受条款之前不会创建任何 cookie

问题描述

我正在尝试实现一种方法来阻止 Symfony 2 创建 cookie。当用户登录客户端站点时,将出现一个弹出窗口,允许用户接受 cookie 策略。只有在这被接受后,才应创建 cookie。在这种情况发生之前,我如何停止 symfony 创建 cookie?

标签: phpsymfony

解决方案


我认为最好的方法是在登录时检查用户。

一种选择是拥有kernel.event_listener

它应该是这样的

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

/**
 * This listener ensure that logged user must accept latest terms of service
 *
 * @author po_taka
 */
class TermsForceListener
{
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        $user = $this->tokenStorage->getToken()->getUser();

        if (!$user instanceof YOUR_CLASS_HERE) {
            return;
        }

        if ($user->getTermsAccepted()) {
            // terms are accepted, continue with the page loading
            return;
        }

        if (YOUR_VALIDATION_IF_CURRENT_PAGE_IS_TERMS_ACEEPTING_PAGE) {
            $response = new \Symfony\Component\HttpFoundation\RedirectResponse(TERMS_ACCEPTING_PAGE, 302);
            $event->setResponse($response);
            $event->stopPropagation();
        }
    }
}

您可以使用以下 yaml 注册它

YOUR_SEVICE_NAME_HERE:
    class: TermsForceListener
    arguments: ['@security.token_storage']
    tags:
        - { name: kernel.event_listener, event: kernel.request }

您可以在此处阅读有关 symfony 事件的更多信息 - https://symfony.com/doc/current/reference/events.html


推荐阅读