ログインした後でも管理者ユーザーまたはフロントエンドユーザーがログインページにアクセスしようとした場合
/admin/login (admin user)
OR
/login (front end user)
/admin
や/
などの関連するホームページにリダイレクトする必要があります
FOSUserBundle\Controller\SecurityController をオーバーライドし、loginAction
の先頭に次のコードを追加できます。
use Symfony\Component\HttpFoundation\RedirectResponse;
// ...
public function loginAction(Request $request)
{
$authChecker = $this->container->get('security.authorization_checker');
$router = $this->container->get('router');
if ($authChecker->isGranted('ROLE_ADMIN')) {
return new RedirectResponse($router->generate('admin_home'), 307);
}
if ($authChecker->isGranted('ROLE_USER')) {
return new RedirectResponse($router->generate('user_home'), 307);
}
// ...
より簡単な解決策は、次の2行をapp/config/security.ymlに追加することです。
always_use_default_target_path&default_target_path、例:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: /login
check_path: /login_check
always_use_default_target_path: false
default_target_path: /your/start/path/
LoginHandlersを使用したSymfony2でのログイン/ログアウトのリダイレクト
AuthenticationSuccessHandlerInterface
を実装して、ログインが成功したときの最後の決定を処理する必要があります。
AuthenticationSuccessHandlerInterfaceを実装します。
<?php
// AcmeBundle\Security\LoginSuccessHandler.php
namespace AcmeBundle\Security;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface {
protected $router;
protected $authorizationChecker;
public function __construct(Router $router, AuthorizationChecker $authorizationChecker) {
$this->router = $router;
$this->authorizationChecker = $authorizationChecker;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token) {
$response = null;
if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
$response = new RedirectResponse($this->router->generate('backend'));
} else if ($this->authorizationChecker->isGranted('ROLE_USER')) {
$response = new RedirectResponse($this->router->generate('frontend'));
}
return $response;
}
}
クラスをサービスとして登録します。
# app/config/services.yml
services:
authentication.handler.login_success_handler:
class: AcmeBundle\Security\LoginSuccessHandler
arguments: ['@router', '@security.authorization_checker']
ファイアウォールのLoginSuccessHandlerクラスへの参照を追加します
# app/config/security.yml
firewalls:
main:
pattern: ^/
form_login:
success_handler: authentication.handler.login_success_handler
default_target_path
で追加したページのコントローラーで目的の方向にリダイレクトするだけです。たとえば、default_target_path: /index
を指定し、インデックスがHomePageCOntroller
で定義されたアクションである場合、HomePageCOntroller
に移動し、現在のユーザーが管理者であるかどうか:
if (($this->container->get('security.context')->isGranted('ROLE_ADMIN')))
その後、彼を管理者スペースに再割り当てします。