Я использую настройку безопасности Symfony. Все работает нормально, но я не знаю, как сделать одну важную вещь:
В ветке я могу получить текущую информацию о пользователе, выполнив:
Welcome, {{ app.user.username }}
или аналогичный
Как мне получить доступ к этой же информации в контроллере? В частности, я хочу получить текущую пользовательскую сущность, чтобы я мог хранить ее реляционно в другом объекте (сопоставление "один к одному" ).
Я действительно надеялся, что это будет
$this->get('security.context')->getToken()->getUser()
но это не сработает. Это дает мне класс типа
Symfony\Component\Security\Core\User\User
и мне нужен один из типов
Acme\AuctionBundle\Entity\User
который является моей сущностью....
Как говорит ktolis, сначала вам нужно настроить /app/config/security.yml
.
Тогда с
$usr= $this->get('security.context')->getToken()->getUser();
$usr->getUsername();
должен быть enougth!
$usr - это ваш пользовательский объект! Вам больше не нужно запрашивать его.
Узнайте, как настроить поставщиков в security.yml
из Документация Sf2 и повторите попытку.
Удачи!
EDIT: из Symfony 2.6, security.context
служба устарела, используйте security.token_storage
службу как:
$this->get('security.token_storage')->getToken()->getUser()
Согласно документации, поскольку Symfony 2.1 просто использует этот ярлык:
$user = $this->getUser();
Вышеупомянутый работает над Symfony 3.2 и является ярлыком для этого:
$user = $this->get('security.token_storage')->getToken()->getUser();
Служба
security.token_storage
была представлена в Symfony 2.6. До Symfony 2.6 вам пришлось использовать методgetToken()
службыsecurity.context
.
Пример. И если вы хотите прямое имя пользователя:
$username = $this->getUser()->getUsername();
Пользователь будет объектом, а класс этого объекта будет зависеть от вашего провайдера .
Нить немного устарела, но я думаю, что это могло бы сэкономить время...
Я столкнулся с той же проблемой, что и исходный вопрос, что тип показан как Symfony\Component\Security\Основные\User\User
В итоге оказалось, что я вошел в систему, используя пользователя в памяти
мой security.yml выглядит примерно так.
security:
providers:
chain_provider:
chain:
providers: [in_memory, fos_userbundle]
fos_userbundle:
id: fos_user.user_manager
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN', 'ROLE_SONATA_ADMIN' ] }
пользовательский тип in_memory всегда является Symfony\Component\Security\Core\User\User, если вы хотите использовать свою собственную сущность, войдите в систему, используя этого пользователя-поставщика.
Спасибо, HJ
$this->container->get('security.token_storage')->getToken()->getUser();
Ну, сначала вам нужно запросить имя пользователя пользователя из сеанса в действии вашего контроллера следующим образом:
$username=$this->get('security.context')->getToken()->getUser()->getUserName();
затем выполните запрос к db и получите ваш объект с регулярным dql, как
$em = $this->get('doctrine.orm.entity_manager');
"SELECT u FROM Acme\AuctionBundle\Entity\User u where u.username=".$username;
$q=$em->createQuery($query);
$user=$q->getResult();
пользователь $теперь должен удерживать пользователя с этим именем пользователя (вы также можете использовать другие поля)
... но вам нужно сначала настроить конфигурацию /app/config/security.yml, чтобы использовать соответствующее поле для своего поставщика безопасности следующим образом:
security:
provider:
example:
entity: {class Acme\AuctionBundle\Entity\User, property: username}
надеюсь, что это поможет!