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

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}

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


답변