【问题标题】:Symfony2 get userID on kernel.controller event listenerSymfony2 在 kernel.controller 事件监听器上获取用户 ID
【发布时间】:2013-10-09 06:49:43
【问题描述】:

有人可以帮我从 event.controller 获取事件监听器中的用户 ID 吗?

#   EventListener
    kernel.listener.corporation.manage:
        class:  Site\CorporationBundle\Event\SiteCorporationManageListener
        arguments: ["@doctrine.orm.entity_manager", "@user.own.item", "@security.context"]
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelRequest }

和监听类

use Doctrine\ORM\EntityManager;
use Site\MainBundle\Service\UserOwnItem;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Security\Core\SecurityContext;

class SiteCorporationManageListener
{
    private $oEntityManager = null;
    private $oUserOwnItem = null;
    private $oSecurityContext = null;

    public function __construct(EntityManager $oEntityManager, UserOwnItem $oUserOwnItem, SecurityContext $oSecurityContext)
    {
        $this->oEntityManager = $oEntityManager;
        $this->oUserOwnItem = $oUserOwnItem;
        $this->oSecurityContext = $oSecurityContext;
    }

    public function onKernelRequest(FilterControllerEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
            $route = $event->getRequest()->get('_route');
            $corporationID = $event->getRequest()->get('corporationID', null);
            $userID = $this->oSecurityContext->getToken()->getUser()->getID();
            //$userID = 3;
            //var_dump($userID);

            if (strstr($route, 'corporation')) {
                if (!strstr($route, 'corporation_index')) {
                    $bUserOwn = $this->oUserOwnItem->setUserID($userID)->setItemType('corporation')->setItemID($corporationID)->userOwn();
                    //var_dump($bUserOwn);
                }
            }
        }
    }
}

我稍后会清理它,我尝试不同的方法来做,但即使通过容器和 security_context 我也无法获取用户 ID。它在 getToken() 方法 = 之后中断。

在这个例子中 $userID 为 null...即使在 getToken()->getUser() 给我 null...

FatalErrorException: Error: Call to a member function getUser() on a non-object in /home/dev/public_html/git.eve-ceo/src/Site/CorporationBundle/Event/SiteCorporationManageListener.php line 32

请帮忙。

【问题讨论】:

    标签: security symfony event-listener


    【解决方案1】:

    可以通过这个获取用户ID。

    包括这个。

    use FOS\UserBundle\Model\UserInterface;
    use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
    

    在这里你得到用户ID

    $user = $this->oSecurityContext->getToken()->getUser();
    
    if (!is_object($user) || !$user instanceof UserInterface) {
       throw new AccessDeniedException('You are not authorize to access this location.');
    }
    else{
        $userID = $user->getId();
    }
    

    【讨论】:

      【解决方案2】:

      您必须像这样使用令牌检查:

      if ($context->getToken() && $context->getToken()->getUser() !== 'anon.')
          $user = $context->getToken()->getUser();
      

      基本上你不是经过身份验证的用户。

      【讨论】:

      • 我不认为 $context->getToken()->getUser() !== 'anon.'真是不错的选择。
      【解决方案3】:

      我也这么认为,但是在 symfony 中如果你在登录前输入“var_dump($user)”,结果是:string 'anon.' (长度=5)。 也许你可以使用 "is_object($user) (对我来说是更好的选择)

      喜欢:

      if ($securityContext->getToken() && is_object($securityContext->getToken()->getUser())){
      

      【讨论】:

        【解决方案4】:

        对于更新,服务 security.context 自 Symfony 2.6 起已弃用。

        所以你的新服务声​​明应该是这样的

        #   EventListener
        kernel.listener.corporation.manage:
            class:  Site\CorporationBundle\Event\SiteCorporationManageListener
            arguments: ["@doctrine.orm.entity_manager", "@user.own.item", "@security.token_storage"]
            tags:
                - { name: kernel.event_listener, event: kernel.controller, method: onKernelRequest }
        

        构造就像

        use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
        
        ...
        
        public function __construct(EntityManager $oEntityManager, UserOwnItem $oUserOwnItem, TokenStorage $tokenStorage)
        {
            $this->oEntityManager = $oEntityManager;
            $this->oUserOwnItem = $oUserOwnItem;
            $this->tokenStorage = $tokenStorage;
        }
        

        那么获取用户就会变成

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

        来源:http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

        【讨论】:

          【解决方案5】:

          有一个类似的问题,我发布了一个解决它的答案:

          https://stackoverflow.com/a/49794146/2564552

          简而言之:在初始化令牌之前调用kernel.controller 上的侦听器,因此您必须使用优先级或(在较新的 Symfony 版本中)只需使用(尚未记录的)kernel.controller_arguments 事件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-15
            • 1970-01-01
            • 1970-01-01
            • 2016-02-28
            • 2016-11-30
            • 1970-01-01
            • 2013-07-01
            相关资源
            最近更新 更多