web-dev-qa-db-ja.com

サービスに現在ログインしているユーザーを取得する方法

Symfony 2.8/3.0では、新しいセキュリティコンポーネントを使用して、現在ログに記録されているUserie FOSUser)オブジェクトを取得するにはどうすればよいですかサービスなしコンテナ全体を注入しますか?

非ハッキーな方法でも可能ですか?

PS:「それをパラメーターとしてサービス関数に渡す」を自明であると考えないでください。また、汚い。

28
xDaizu

security.token_storageサービスをサービスに挿入し、次を使用します。

$this->token_storage->getToken()->getUser();

ここで説明されているとおり: http://symfony.com/doc/current/book/security.html#retrieving-the-user-object そしてここ: http://symfony.com /doc/current/book/service_container.html#referencing-injecting-services

46
Miro

コンストラクター依存関係注入を使用すると、次の方法で実行できます。

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class A
{
    private $user;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->user = $tokenStorage->getToken()->getUser();
    }

    public function foo()
    {
        dump($this->user);
    }
}
28
Mateusz

バージョン3.4の新機能:セキュリティユーティリティクラスはSymfony 3.4で導入されました。

use Symfony\Component\Security\Core\Security;

public function indexAction(Security $security)
{
    $user = $security->getUser();
}

https://symfony.com/doc/3.4/security.html#always-check-if-the-user-is-logged-in

17
Kim

Symfo 4の場合:

use Symfony\Component\Security\Core\Security;

class ExampleService
{
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public function someMethod()
    {
        $user = $this->security->getUser();
    }
}

ドキュメントを参照してください: https://symfony.com/doc/current/security.html#retrieving-the-user-object

9
William Rossier

Symfony 3.3から、コントローラーのみから、このブログ投稿: https://symfony.com/ blog/new-in-symfony-3-2-user-value-resolver-for-controllers

次のように簡単です:

use Symfony\Component\Security\Core\User\UserInterface

public function indexAction(UserInterface $user)
{...}
4
Thomas Decaux

SymfonyはこれをSymfony\Bundle\FrameworkBundle\ControllerControllerTraitで行います

protected function getUser()
{
    if (!$this->container->has('security.token_storage')) {
        throw new \LogicException('The SecurityBundle is not registered in your application.');
    }

    if (null === $token = $this->container->get('security.token_storage')->getToken()) {
        return;
    }

    if (!is_object($user = $token->getUser())) {
        // e.g. anonymous authentication
        return;
    }

    return $user;
}

したがって、単にsecurity.token_storageを挿入して置換するだけでいいのです。

2
simPod

コントローラのクラス拡張の場合

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

または、コンテナ要素にアクセスできる場合。

$container = $this->configurationPool->getContainer();
$user = $container->get('security.context')->getToken()->getUser();

http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements