Symfony2从twig扩展服务访问用户


Symfony2 access user from twig extension service

当我注入安全。上下文在我的symfony2服务(twig扩展)出现以下错误:

在非对象上调用成员函数getUser() .....

class GeninnoShareboardExtension extends 'Twig_Extension {
    public function __construct(ContainerInterface $container, SecurityContext $context) {
        $this->doctrine = $container->get('doctrine');
        $this->context = $context;
    }
    public function getUser() {
        return $this->context->getToken()->getUser();
    }
    ........
}

我的服务。Yml看起来像这样:

services:
  geninno.twig.extension.dashboard:
    class: Geninno'EDSBundle'Twig'Extension'GeninnoShareboardExtension
    arguments:
      container: "@service_container"
      service: "@security.context"
    tags:
     - { name: twig.extension }

一个用户登录了,我的防火墙设置如下:

access_control:
    - { path: ^/secured/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/secured/create, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: [IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED] }

你应该试试

services:
  geninno.twig.extension.dashboard:
    class: Geninno'EDSBundle'Twig'Extension'GeninnoShareboardExtension
    arguments: [@service_container, @security.context]
    tags:
     - { name: twig.extension }

是在防火墙后面你得到错误的页面?否则它将无法访问安全令牌。您需要将页面置于防火墙之后,然后将其开放给未经身份验证的用户。

类似这样的内容应该可以将页面打开给未经身份验证的用户,但仍然将其置于防火墙内(security.yml)

access_control:
  - { path: /lost_password, roles: IS_AUTHENTICATED_ANONYMOUSLY}

我通过在SecurityContext调用中添加if来解决这个问题。检查GetToken()返回的是对象(authenticated)还是字符串(anonymous)

if (is_object($this->context->getToken()))
{
    .... // getUser() etc.
}