課題
Symfonyでログインフォームを作りました。
ユーザは一般と管理者の2つのロールがあり、ログイン後のページを変えたいです。
前提
ログイン処理は、公式ドキュメントのHow to Build a Login Formで実装
ログイン後のリダイレクト先の変更を調査
キーワード「symfony login redirect role」でググると、symfony2
のドキュメントばかりでてきます。
検索結果から以下のようなドキュメントを拾い読みをしてみて、何やらログイン後のイベントで処理するような感じと当たりをつけます。Symfony2だからアテにしてはダメなのに、これが間違いの元でした。
- How to redirect to different url based on roles in symfony 2
- How redirect in onSecurityInteractiveLogin method in LoginListener - Symfony2
いろいろ試行錯誤してみて、リダイレクトのレスポンスを書き換えるということは、フックでするような処理じゃないなっと結論。
How to Build a Login Formのステップ3に記載のonAuthenticationSuccess
メソッドに手を入れることで終了。
こんな感じで解決ができました。
public function __construct(UrlGeneratorInterface $urlGenerator, Security $security)
{
$this->urlGenerator = $urlGenerator;
$this->security = $security;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
return new RedirectResponse($targetPath);
}
if ($this->security->isGranted('ROLE_ADMIN')) {
return new RedirectResponse($this->urlGenerator->generate('admin_main'));
}
return new RedirectResponse($this->urlGenerator->generate('user_main')); }
その他にはまったこと
セッションにログイン前にアクセスに来たURLを保存しているので、ログイン後に目的のページを表示するようになっています。
正しい手続きでログアウトをすれば、このセッション情報は使われないと考えていたのですが、一般ページが記録されていたようです。
何度、管理者でログインをしても、常に一般ページが表示されて、実装方法に問題があるのかと、さらに時間がかかりました。
クッキーを削除することで、セッション情報をリセットしたら、想定どおりの動作をしました。
まとめ
古いドキュメントやリソースは無視しないと、あらぬ方向に連れて行かれる場合がある。