2013-04-05 46 views
6

当我在Symfony2的服务注入security.context(树枝扩展)出现以下错误:Symfony2的接入用户

呼叫一个成员函数的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(); 
    } 

    ........ 
} 

我services.yml看起来是这样的:

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

用户I š登录和我的防火墙设置是这样的:

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] } 

回答

1

我解决它通过添加如果我的SecurityContext的电话。 检查,如果为gettoken()返回的对象(认证)或字符串(匿名)

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

你应该尝试

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

谢谢你,但它并没有解决问题 – Raymen 2013-04-05 19:11:36

1

是你所得到的错误在防火墙后面的页面?如果没有,那么它将无法访问安全令牌。您需要将该页面放在防火墙后面,然后将其打开,以供未经身份验证的用户使用。

这样的事情应该做的伎俩,以打开网页多达未经验证的用户,但仍然有它的防火墙(security.yml)内

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

谢谢你,但我所有的页面都应该是在防火墙后面,检查我的更新了我的防火墙设置的问题 – Raymen 2013-04-05 19:17:31