Symfony2에서 현재 사용자를 나타내는 엔티티는 어떻게 얻습니까?


136

Symfony 보안 설정을 사용하고 있습니다. 모든 것이 잘 작동하지만 중요한 한 가지 방법을 모르겠습니다.

나뭇 가지에서 나는 다음을 수행하여 현재 사용자 정보에 도달 할 수 있습니다.

Welcome, {{ app.user.username }}

또는 유사

컨트롤러에서 동일한 정보에 어떻게 액세스합니까? 특히 현재 사용자 엔터티를 가져 와서 다른 엔터티에 관계형으로 저장할 수 있습니다 (일대일 매핑).

나는 정말로 그것이기를 바랐다.

$this->get('security.context')->getToken()->getUser()

그러나 그것은 작동하지 않습니다. 그것은 나에게 유형의 클래스를 제공

Symfony\Component\Security\Core\User\User

그리고 나는 유형 중 하나를 원한다

Acme\AuctionBundle\Entity\User

그것은 나의 실체입니다 ....


답변:


209

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 에서 공급자를 설정하는 방법을 찾아 다시 시도하십시오.

최고의 행운!


PHP 템플릿에 사용자 엔티티가 필요한 경우 어떻게합니까?
DomingoSL

@DomingoSL 공식 문서에서 다음 링크를 확인하십시오 : symfony.com/doc/master/book/…
Cristian Douce

5
Symfony 2.6부터 security.context 서비스는 더 이상 사용되지 않으며 security.authorization_checker 및 security.token_storage의 두 가지 새로운 서비스로 분할되었습니다. 여기에서 현재 사용자를 가져 오는 올바른 방법을 확인할 수 있습니다. symfony.com/blog/…
jmleroux

내가 심포니 5.1.2과에있어 $user = $this->security->getUser();, $user항상 null또는하지 로그인 여부, 나를 위해.
Nick Rolando

이벤트 구독자 에서이 작업을 수행하고 있기 때문에 요청 초기에 아직 초기화되지 않은 것 같습니다.
Nick Rolando

62

모범 사례

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();

잘못된 사용자 클래스 유형

사용자는 객체가되고 해당 객체의 클래스는 사용자 공급자 에 따라 다릅니다 .


6

실이 조금 낡았지만 아마도 누군가의 시간을 절약 할 수 있다고 생각합니다 ...

원래 질문과 동일한 문제가 발생하여 유형이 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


4

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 () 단축키를 계속 사용하는 것이 좋습니다.

그것에 대한 블로그 게시물


이것은 EventSubscriber에서 현재 사용자를 얻는 동안 많은 도움이되었습니다. __construct의 매개 변수로 autowire (보안 $ 보안)를 수행 한 다음 $ security-> getUser () 및 voilà를 사용해야했습니다!
tsadiq

2
$this->container->get('security.token_storage')->getToken()->getUser();

2
stackoverflow에 오신 것을 환영합니다. 답변에 대해 설명하십시오. stackoverflow.com/help/how-to-answer
Rohan Khude

-36

먼저 컨트롤러 작업의 세션에서 다음과 같이 사용자의 사용자 이름을 요청해야합니다.

$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}

도움이 되었기를 바랍니다!


Martin은 사용자 나 사용자 이름을 원합니다. 선택은 당신입니다. 필요한 물건을 얻는 것은 당신의 책임입니다. 그리고 당신이 말했듯이 당신은 일반 사용자가 아니라 Acme 네임 스페이스 사용자를 원하지 않습니다.
ktolis

6
"Acme \ AuctionBundle \ Entity \ User u에서 u를 선택하십시오. 여기서 u.username =". $ username; = 매개 변수가있는 쿼리를 사용해야합니다!
CappY

1
$this->get('security.context')->getToken()->getUser()자체적으로 로그인 한 사용자 개체를 가져옵니다. 다시 쿼리 할 필요가 없습니다. 실제로 어떤 버전을 사용하고 있습니까?
Jeet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.