LoginSignup
14
16

More than 5 years have passed since last update.

Symfonyでログインフォームへ入力させずにユーザをログインさせる

Last updated at Posted at 2013-10-22

ワンタイムトークンを踏んで自動的にログイン、サインアップ直後に自動ログインしてプロフィール編集まで行かせたい、など、ログインフォームへ入力させずに、特別にユーザ にログインセッションを与えたい。

security.yml がこんな感じで、エンティティのプロバイダを使った(Symfony\Component\Security\Core\User\UserInterface を実装したUserクラスを使う) フォームログインだったとしたら...

security:
    providers:
        users:
            entity:
                class: HogeFugaBundle:User
                property: name
    firewalls:
        secured_area:  # ここの名前あとで使う
            pattern: ^/...
            form_login: ~
            logout: ~

こんなふうにするとオッケー。

use Hoge\Bundle\FugaBundle\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\SecurityContext;

        /** @var $user User */
        $user = $this->get('doctrine')->getRepository(
            'HogeFugaBundle:User'
        )->findOneBy(array(
            'name' => 'tanakahisateru',  // ユーザ名
        ));

        $providerKey = 'secured_area';  // 上の security.firewall のやつ

        // エンティティとキーから認証トークンを作る
        $token = new UsernamePasswordToken(
            $user, null, $providerKey, $user->getRoles()
        );

        /** @var $securityContext SecurityContext */
        $securityContext = $this->get('security.context');
        // 認証トークンをセット。あとはHTTPレスポンスを返せればOK。
        $securityContext->setToken($token);

これでできたログインセッションの強制ログアウトはこれでいけました。

        /** @var $securityContext SecurityContext */
        $securityContext = $this->get('security.context');
        $securityContext->setToken(null);
14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16