Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security Symfony2在kernel.controller事件侦听器上获取用户ID_Security_Symfony_Event Listener - Fatal编程技术网

Security Symfony2在kernel.controller事件侦听器上获取用户ID

Security Symfony2在kernel.controller事件侦听器上获取用户ID,security,symfony,event-listener,Security,Symfony,Event Listener,有人能帮我从event.controller获取事件侦听器中的用户ID吗 # EventListener kernel.listener.corporation.manage: class: Site\CorporationBundle\Event\SiteCorporationManageListener arguments: ["@doctrine.orm.entity_manager", "@user.own.item", "@security

有人能帮我从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);
                }
            }
        }
    }
}
我稍后会清理它,我尝试了不同的方法,但即使通过容器和安全上下文,我也无法获取userID。它在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

请提供帮助。

您必须使用以下方式检查令牌:

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

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

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

比如:


您可以使用此获取用户id

包括这个

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

这是你的用户名

$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();
}

对于更新,自Symfony 2.6以来,不推荐使用服务
security.context

因此,您的新服务声明应该如下所示

#   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();

来源:

有一个类似的问题,我在那里发布了一个解决这个问题的答案:


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

我不认为$context->getoken()->getUser()!==“anon.”是一个很好的选择。
$user = $this->tokenStorage->getToken()->getUser();