2012-02-06 3 views
15

symfony2のセキュリティ設定を取得しようとしていますが、これまでのところ動作していますが、今はもっと魅力的なことをする必要があります。私は現在、PreAuthenticationを扱うすべてのものを使用しています(私はログインとセッション管理のために第三者コンポーネントを使用しています)。その部分はJMSセキュリティーバンドルと並行して機能しています。Symfony2のAccessDeniedHandlerInterfaceの使用

今、私は403を投げているユーザーを捕まえたいので、使用しているサードパーティコンポーネントのログインページに転送することができます。私の最善の策は、例外ハンドラを例外リスナに追加することです。私はAccessDeniedHandlerInterfaceを見ています。

  1. これは正しい方向ですか?
  2. このハンドラを例外リスナーに追加するにはどうすればよいですか?

編集: 私は同様のことをやった。私はkernel.exceptionイベントでプロンプトされるサービスを作成しました。

services: 
    kernel.listener.accessDenied: 
    class: Fully\Qualified\Namespace\Path\To\Class 
    tags: 
     - { name: kernel.event_listener, event: kernel.exception, method: onAccessDeniedException } 

とクラス、それを自己::

<?php 

namespace Fully\Qualified\Namespace\Path\To; 

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent, 
Symfony\Component\HttpFoundation\Response, 
Symfony\Component\Security\Core\Exception\AccessDeniedException; 

class Class 
{ 
    public function onAccessDeniedException(GetResponseForExceptionEvent $event) 
    { 
    $exception = $event->getException(); 
    //Get the root cause of the exception. 
    while (null !== $exception->getPrevious()) { 
     $exception = $exception->getPrevious(); 
    } 
    if ($exception instanceof AccessDeniedException) { 
     //Forward to third-party. 
    } 
    } 
} 

答えて

21

これは権利について鳴るservices.ymlは次のようになります。

それとも、あなたはAccessDeniedExceptionで特に興味があるなら、あなたはまた、security.ymlにファイアウォール内access_denied_handlerを定義することができます。

security: 
    firewalls: 
     my_firewall: 
      # ... 
      access_denied_handler: kernel.listener.access_denied.handler 
      # ... 

を次に、あなたのservices.xmlまたは同等であなたのサービスを定義します。

<parameters> 
    <parameter key="kernel.listener.security.class">Path\To\Your\Class</parameter> 
</parameters> 

<service id="kernel.listener.access_denied.handler" class="%kernel.listener.security.class%"> 
    <tag name="kernel.event_listener" event="security.kernel_response" method="handle" /> 
</service> 

ハンドラクラス:

use \Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface; 

class MyAccessDeniedHandler implements AccessDeniedHandlerInterface 
{ 
    public function handle(Request $request, AccessDeniedException $accessDeniedException) 
    { 
     // do something with your exception and return Response object (plain message of rendered template) 
    } 
} 

Symfony2の完全なセキュリティリファレンスはこちらから:http://symfony.com/doc/2.8/reference/configuration/security.html

関連する問題