2015-09-23 4 views
3

official Symfony documentation говорит нам следующее:Почему мы не должны проверить объект пользователя, чтобы проверить, если пользователь находится в сети в Symfony2

// yay! Use this to see if the user is logged in 
if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) { 
    throw $this->createAccessDeniedException(); 
} 

// boo :(. Never check for the User object to see if they're logged in 
if ($this->getUser()) { 

} 

Я никогда использовал $this->getUser() до сих пор без проблем, как проверить, если пользователь находится в режиме онлайн и получает текущего зарегистрированного пользователя, и только что обнаружил, что это неправильно. Но я не могу найти, почему это неправильно.

Может ли кто-нибудь сказать или привести пример, где это может вызвать проблему? Я не вижу проблемы, так как он всегда возвращает null (преобразованный из anon., как говорят документы), если никто не зарегистрировался и текущий вход в пользовательский класс как объект с доступом к его методам.

+1

Возможно, потому что всегда есть объект пользователя? «Тотчас». аутентифицирован, но имеет анонимный токен, поэтому он не полностью аутентифицирован. Это просто идея ... –

+0

Это так, но вызов его без входа в систему всегда возвращает значение null, поэтому в чем проблема с его использованием вместо проверки безопасности? –

ответ

5

Я думаю, что это вызвано памятными жетонами.

Документы Symfony заявляют следующее:

Пользователей, которые вошли в только из-за «запомнить меня печенье» будет у IS_AUTHENTICATED_REMEMBERED, но не будет иметь IS_AUTHENTICATED_FULLY.

$this->getUser() не делает этого различия, поэтому рекомендуется использовать authorization_checker. По этой причине я полагаю, что эта рекомендация просто делается для того, чтобы избежать потенциальных проблем, с которыми могут столкнуться разработчики, которые не знают об этом факте.

+0

Звучит как причина! Nice catch –

+0

Но $ this-> getUser() возвращает текущего пользователя как для запоминающихся пользователей, так и для полностью аутентифицированных. –

+0

@GeorgeIrimiciuc: Да, и в большинстве случаев это должно быть эквивалентно использованию метода authorization_checker. Однако в некоторых ситуациях это может быть не так, поэтому документы стараются и заставляют людей избегать этого, в первую очередь, называя его плохой практикой. – ciruvan

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