2017-08-22 17 views
0

私はSymfony 2.7プロジェクトに取り組んでいます。セッションが切れると、特定のページでユーザーをリダイレクトしたいと思います。 役割とルートを確認するリスナーを作成しました。ユーザーが認証されずに認証済みルートにアクセスしようとすると、特定のページにリダイレクトされます。 ホームページへのデフォルトのリダイレクトが優先されるため、これは現時点では機能していません。symfonyは、セッションが終了したときのデフォルトのリダイレクトを防止します。

これはリスナーです:

use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\Routing\Router; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; 

はsymfony \コンポーネント\セキュリティ\コア\認証\ AuthorizationCheckerを使用します。

class UserDisconnectionListener 
{ 
    protected $router; 
    protected $security; 
    protected $tokenStorage; 

    public function __construct(Router $router, AuthorizationChecker $security, TokenStorage $tokenStorage) 
    { 
     $this->router = $router; 
     $this->security = $security; 
     $this->tokenStorage = $tokenStorage; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     $loggedRoutes = ['user_account', 'user_index', '...']; 
     $url = ''; 

     if($this->tokenStorage->getToken() !== null) { 
      if(!$this->security->isGranted('IS_AUTHENTICATED_OPENID')) { 
       if (in_array($request->get('_route'), $loggedRoutes)) { 
        $url = $this->router->generate('disconnection_route'); 
       } 
      } 

      if(strlen($url) > 0) { 
       $response = new RedirectResponse($url); 
       $event->setResponse($response); 
      } 
     } 
    } 
} 

app.userroute.listener: 
    class: app\UserBundle\Listener\UserDisconnectionListener 
    arguments: ['@router.default', @security.authorization_checker, @security.token_storage] 
    scope: request 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

もっと良い方法がありますか? 優先度タグを使用しようとしましたが、優先度は設定されていません。 ログに記録しようとしましたが、 'user_index'のルートにアクセスしようとしたときに、私のlisternerログに、私はすでにホームページのgeneral_indexルートにリダイレクトされていました。

PS:私はFOSUserBundleとOpenIDバンドルを組み合わせて使用​​しています。

+0

この投稿をお読みください。https://stackoverflow.com/questions/22232587/how-to-auto-redirect-a-user-in-symfony-after -a-session-time-out。 「IS_AUTHENTICATED_OPENID」とは何ですか? – Mcsky

+0

私がそれをうまく理解すれば、 '' '' ''はページを更新し、 '' SessionIdleHandler'''はユーザーがまだログ彼がいない場合はリダイレクトしてください –

+0

IS_AUTHENTICATED_OPENIDは、ユーザーが認証されたことを意味する役割です。 –

答えて

0
tags: 
    - { name: kernel.event_listener, priority: -256, event: kernel.request, method: onKernelRequest } 

https://symfony.com/doc/2.7/event_dispatcher.htmlチェックsymfonyのイベントのドキュメント、および優先

このタグオプション彼はリスナーを呼び出すためにぐるぐるたために、symfonyのに指定を検索します。

認証されたルートのリストを「ハードコード」するのは最善の方法ではありません。追加するのを忘れた場合、コードは機能しません。認証されたルートを動的に取得しようとする必要があります

+0

私は-2000で試してみたが、うまくいかなかった。私も-256を試してみましたが、動作していません。ホームページのリダイレクトには優先度があるようです。 –

+0

動作するはずですが、リスナーが実行されたときに呼び出されたルートとそのホームページを記録しました。なぜそれは動作していないのですか? –

+0

私はそれがSymfonyの認可の一部であり、あなたをホームページにリダイレクトしていると思います。このコードは高レベルで実行されます。私はそれを無効にする方法はわかりませんが、この方法で検索する必要があります。私は私の答えを取り除くべきですか? – Mcsky

関連する問題