2017-02-25 23 views
2

私は安らかなAPIを実装しました。 そして、私はセッション処理に問題があります。 セッションがタイムアウトすると、ユーザーはページを更新して$ this-> getUser()が空で500エラーが発生し、このエンドポイントのユーザーデータを記録する必要があります。 これではなく、ユーザーがページをリフレッシュしてセッションが終了したときに、403エラーが表示されたり、URLにリダイレクトされたりします。 どうすればいいですか? カーネルリスナーを使うべきですが、セッションをチェックする方法はすでに期限切れですか?多分security.ymlを変更するだけの解決策がありますか?symfonyセッションの有効期限が切れた後にログインページにリダイレクト

私はjms/di-extra-bundleを使用していることを忘れてしまったので、コントローラに管理者を注入します。これらのマネージャーはコントローラーアクションの前に実行されるので、ユーザーがコントローラーではなくマネージャーにログインしているかどうかを確認する必要があります。私はすべてのマネージャーの行動にコードを複製したくないのですが、どのようにすればよりエレガントな方法で対応できますか?

私は例えば、*カーネルでアクションをリスナーを使用しようとしました:

class KernelListener 
{ 

private $tokenStorage; 

public function __construct(TokenStorageInterface $tokenStorage) 
{ 
    $this->tokenStorage = $tokenStorage; 
} 

public function onKernelRequest(GetResponseEvent $event) 
{ 
    $kernel = $event->getKernel(); 
    $request = $event->getRequest(); 
      $user = $this->tokenStorage->getToken()->getUser(); 

    if(!$user instanceof SempUser || $user == null) { 
     throw new AccessDeniedException(); 
    } 
} 

public function onKernelResponse(FilterResponseEvent $event) 
{ 
    $response = $event->getResponse(); 
    $request = $event->getRequest(); 
    $kernel = $event->getKernel(); 

    $user = $this->tokenStorage->getToken()->getUser(); 

    if(!$user instanceof SempUser || $user == null) { 
     throw new AccessDeniedException(); 
    } 

} 

public function onKernelException(GetResponseForExceptionEvent $event) 
{ 
    $user = $this->tokenStorage->getToken()->getUser(); 

    if(!$user instanceof SempUser || $user == null) { 
     throw new AccessDeniedException(); 
    } 

} 

} 

そして、私のservices.yml:

kernel.listener: 
     class: AppBundle\Listener\KernelListener 
     arguments: ["@security.token_storage"] 
     tags: 
      - { name: kernel.event_listener, event: kernel.exception } 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
      - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

しかし、それは動作しません...

+0

あなたがこれまでに試してみましたか?私たちといくつかのコードを共有できますか?多分このリンクはあなたを助けるでしょうhttp://symfony.com/doc/current/components/security/authentication.html –

+0

こんにちは、私はいくつかのサンプルコードを含んでいます。 – r3m4k3

答えて

0

セッション処理のために、私はsecurity.ymlを利用することを提案します。ファイアウォールルールと保護された領域をアプリケーションに定義できます(http://symfony.com/doc/current/security/firewall_restriction.html)。

Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactoryに拡張されたYourOwnFactoryクラスを作成し、Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterfaceを実装して、認証を処理する独自の認証プロバイダを定義することができます。

ここでそれについての詳細を読むhttp://symfony.com/doc/current/security/custom_authentication_provider.html

のsecurity.yml

security: 
    firewalls: 
     [...] 
     secured_area: 
      pattern: ^/ 
      your_own_factory: ~ #tells symfony to use the AppBundle\Security\YourOwnFactory 
+0

ありがとう、それは私がしたいことではありません。このリスナーは認証の失敗/成功を処理します。セッションの有効期限を処理します。 – r3m4k3

+0

申し訳ありませんが、私の悪い。私は自分の答えを更新しました。それが役に立てば幸い –

関連する問題