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