2012-02-06 10 views
15

Symfony2 için güvenlik ayarları kurulumumu almaya çalışıyorum ve şu ana kadar çalışıyorum, ama şimdi daha güzel şeyler yapmam gerekiyor. Şu anda PreAuthentication ile ilgili her şeyi kullanıyorum (oturum açma ve oturum yönetimi için üçüncü taraf bir bileşen kullanıyorum). Bu bölüm, JMS güvenlik paketi ile birlikte çok çalışıyor.Symfony2'nin AccessDeniedHandlerInterface Kullanarak

Şimdi, 403'ü atayan kullanıcıları yakalamak istediğim noktaya geliyorum, böylece bunları kullanıyorum üçüncü taraf bileşeninin giriş sayfasına yönlendirebiliyorum. Bence en iyi bahis, istisna dinleyicisine bir istisna işleyici eklemek. AccessDeniedHandlerInterface'a bakıyorum.

  1. Bu benim gitmem için doğru yön mü?
  2. Bu işleyiciyi özel durum dinleyicisine nasıl ekleyebilirim?

DÜZENLEME: Benzer bir şey yaptım. Kernel.exception olayı üzerinde istenen bir hizmet oluşturdum.

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

ve sınıf kendini: services.yml şöyle Bu doğru söylüyorsun

<?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. 
    } 
    } 
} 

cevap

21

.

Veya, AccessDeniedException içinde ayrıca security.yml da güvenlik duvarı içinde access_denied_handler tanımlayabiliriz özellikle ilgileniyorsanız:

<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> 

:

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

Ardından services.xml veya eşdeğeri hizmetinizi tanımlamak işleyici sınıfı:

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'nin Güvenlik referansının tamamını burada bulabilirsiniz: http://symfony.com/doc/2.8/reference/configuration/security.html

İlgili konular