Symfony 보안 설정을 사용하고 있습니다. 모든 것이 잘 작동하지만 중요한 한 가지 방법을 모르겠습니다.
나뭇 가지에서 나는 다음을 수행하여 현재 사용자 정보에 도달 할 수 있습니다.
Welcome, {{ app.user.username }}
또는 유사
컨트롤러에서 동일한 정보에 어떻게 액세스합니까? 특히 현재 사용자 엔터티를 가져 와서 다른 엔터티에 관계형으로 저장할 수 있습니다 (일대일 매핑).
나는 정말로 그것이기를 바랐다.
$this->get('security.context')->getToken()->getUser()
그러나 그것은 작동하지 않습니다. 그것은 나에게 유형의 클래스를 제공
Symfony\Component\Security\Core\User\User
그리고 나는 유형 중 하나를 원한다
Acme\AuctionBundle\Entity\User
그것은 나의 실체입니다 ….
답변
Symfony 4+, 2019+ 접근법
symfony 4 (아마도 3.3이지만 실제로 4에서만 테스트 됨) 에서는 다음과 같이 컨트롤러에서 자동 배선 을 Security
통해 서비스를 주입 할 수 있습니다 .
<?php
use Symfony\Component\Security\Core\Security;
class SomeClass
{
/**
* @var Security
*/
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
public function privatePage() : Response
{
$user = $this->security->getUser(); // null or UserInterface, if logged in
// ... do whatever you want with $user
}
}
심포니 2- 어프로치
@ktolis가 말했듯이 먼저을 구성해야합니다 /app/config/security.yml
.
그런 다음
$user = $this->get('security.token_storage')->getToken()->getUser();
$user->getUsername();
넉넉해야합니다!
$user
사용자 개체입니다! 다시 쿼리 할 필요가 없습니다.
Sf2 Documentationsecurity.yml
에서 공급자를 설정하는 방법을 찾아 다시 시도하십시오.
최고의 행운!
답변
모범 사례
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 \ Core \ 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
답변
symfony> = 3.2에서 설명서 에는 다음과 같이 명시되어 있습니다.
컨트롤러에서 현재 사용자를 얻는 다른 방법은 UserInterface를 사용 하여 컨트롤러 인수를 입력 힌트로 사용하는 것입니다 (로그인이 옵션 인 경우 기본값은 null로 설정 됨).
use Symfony\Component\Security\Core\User\UserInterface\UserInterface; public function indexAction(UserInterface $user = null) { // $user is null when not logged-in or anon. }
Symfony 기본 컨트롤러 에서 확장 하지 않고 ControllerTrait도 사용하지 않는 숙련 된 개발자에게만 권장
됩니다. 그렇지 않으면 getUser () 단축키를 계속 사용하는 것이 좋습니다.
그것에 대한 블로그 게시물
답변
$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();
$ user는 이제이 사용자 이름으로 사용자를 보유해야합니다 (물론 다른 필드를 사용할 수도 있습니다)
…하지만 먼저 보안 공급자에 적합한 필드를 사용하도록 /app/config/security.yml 구성을 구성해야합니다.
security:
provider:
example:
entity: {class Acme\AuctionBundle\Entity\User, property: username}
도움이 되었기를 바랍니다!