2014-10-16 54 views
1

我开发一个API,当我尝试,则基本我不能让当前的用户:Symfony2中获取当前用户

FatalErrorException: Error: Call to a member function getUser() on a non-object 

下面你会发现,引起了security.yml部分错误(我认为它):

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 
    main: 
     pattern:  ^/ 
     anonymous:  true 
     stateless:  true 
     http_basic: 
      realm: "REST Service Realm" 
      provider: fos_userbundle 

access_control: 
    - { path: ^/users/me,  role: IS_AUTHENTICATED_FULLY } 

我只是把路径在access_control我测试。我还有更多。

我使用FOSRestBundle以及FOSUserBundle(因为你可以看到),我不希望把一个前缀,因为它是多余的:

// Routing.yml 
rest : 
    type : rest 
    resource : "routing_rest.yml" 

现在在错误发生的部分在用户控制器(扩展FOSUser之一):

private function response($data, $status, $groups = array()) 
{ 
    $currentUser = $this->container->get('security.context')->getToken()->getUser(); 
    if (!$currentUser) 
     $groups = array("anon"); 
    else 
    { 
     if ($currentUser->hasRole("ROLE_SUPER_ADMIN")) 
      array_push($groups, "admin"); 
     else if ($currentUser->hasRole("ROLE_ADMIN")) 
      array_push($groups, "admin"); 
     else if ($currentUser->hasRole("ROLE_USER")) 
      array_push($groups, "user"); 
    } 
    return $this->view($data, $status)->setSerializationContext(SerializationContext::create()->setGroups($groups)); 
} 

任何想法有什么不对?

+0

euhm,哪里是产生错误的线?很高兴看到实际的原因... – NDM 2014-10-16 15:30:37

+0

对不起,我更新了它。 – Romain 2014-10-16 16:37:06

+1

直接在此控制器中调用'$ this-> getUser();'请参阅[doc](http://symfony.com/doc/current/book/security.html#retrieving-the-user-object) – chrisben 2014-10-16 20:27:11

回答

2

问题是您的令牌为空。如果您的令牌不存在,则您拥有未知用户。

$token = $this->container->get('security.context')->getToken(); 
if (!$token) { 
    return ('anon.'); 
} 
$user = $token->getUser(); 
+0

正如我在之前的评论中所说的,我使用了chrisben解决方案。 我认为你的作品也是如此,但时间更长。我必须检查两次(对于令牌和用户)。 但是非常感谢=) – Romain 2014-10-17 07:35:30