2014-10-16 6 views
1

Я разрабатываю АНИ, и я не могу получить текущий пользователь, когда я попробовать BasicAuth: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" 

Теперь часть, где происходит ошибка находится в UserController (расширение FOSUser one):

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

+0

Извините, я обновил его. – Romain

+1

вызов '$ this-> getUser();' непосредственно внутри этого контроллера - см. [Doc] (http://symfony.com/doc/current/book/security.html#retrieving-the-user-object) – chrisben

ответ

2

Проблема в том, что ваш токен равен нулю. У вас неизвестный пользователь, если ваш токен не существует.

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

Как я уже говорил в предыдущем комментарии, я использовал решение chrisben. Я думаю, что твои работы тоже, но это немного дольше. И мне придется дважды проверять (для токена и пользователя). Но спасибо в любом случае =) – Romain

Смежные вопросы