14

FOSUserBundleバンドルを使用してSymfony2でWebアプリケーションを構築しています。
ユーザーはアカウントを作成し、ログインしてアプリケーションの使用を開始します。

私が今達成したいのは、ユーザーがログインしている場合に表示されている可能性のある任意のページからユーザーを自分のアカウントにリダイレクトさせることです。
これには次のものが含まれます。

  • ログインページに戻った場合
  • 登録ページに戻った場合
  • 彼らがウェブサイトのホームページに行くなら
  • メールを確認したら
  • パスワードをリセットしたら

基本的に、コードは次のようになります。

$container = $this->container;
$accountRouteName = "DanyukiWebappBundle_account";
if( $container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
    // authenticated (NON anonymous)
    $routeName = $container->get('request')->get('_route');
    if ($routeName != $accountRouteName) {
        return $this->redirect($this->generateUrl($accountRouteName));
    }
}

問題は、そのコードがどこに行くべきかわからないことです。
すべての要求に対して実行する必要があります。Symfony1ではフィルターを使用していました。

4

2 に答える 2

31

私は自分で解決策を見つけました:

<?php

namespace Danyuki\UserBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class LoggedInUserListener
{
    private $router;
    private $container;

    public function __construct($router, $container)
    {
        $this->router = $router;
        $this->container = $container;
    }    

    public function onKernelRequest(GetResponseEvent $event)
    {
        $container = $this->container;
        $accountRouteName = "DanyukiWebappBundle_account";
        if( $container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
            // authenticated (NON anonymous)
            $routeName = $container->get('request')->get('_route');
            if ($routeName != $accountRouteName) {
                $url = $this->router->generate($accountRouteName);
                $event->setResponse(new RedirectResponse($url));
            }
        }
    }
}

そして、私のバンドルのservices.ymlファイルで:

services:
    kernel.listener.logged_in_user_listener:
            class: Danyuki\UserBundle\Listener\LoggedInUserListener
            tags:
                - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
            arguments: [ @router, @service_container ]  
于 2012-05-09T08:42:21.223 に答える
1

一度だけチェックしたい場合は、このソリューションを実行することもできます。

ログインが成功するたびにトリガーされるイベントがあります。 イベントの名前は次のとおりです。

security.interactive_login

このイベントをサブスクライブするには、作成したクラスでサービスコンテナを作成し、たとえば「LoginListener.php」とし、タグ「kernel.even_listener」にイベント「security.interactive_login」を挿入する必要があります。

<service id="mylogin.success.listener" class="path\to\class\LoginListener">
   <tag name="kernel.event_listener" event="security.interactive_login" method="onLoginSuccess" />
</service>

LoginListenerの場合:

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

public function onLoginSuccess(InteractiveLoginEvent $event) {
   if ($this->_security->isGranted('IS_AUTHENTICATED_FULLY')) {
      //your code here...
   }
}

他の依存関係を追加してコンストラクターに挿入することもできます。私の場合、セキュリティ、セッション、コンテナーを挿入する必要がありました。

public function __construct(SecurityContext $security, Session $session,            ContainerInterface $container) {

}
于 2014-03-07T07:09:31.377 に答える