2012-02-06 4 views
15

Próbuję ustawić moje ustawienia bezpieczeństwa dla symfony2 i mam to działa do tej pory, ale teraz muszę zrobić kilka bardziej wymyślnych rzeczy. Obecnie używam wszystkiego, co ma do czynienia z PreAuthentication (do logowania i zarządzania sesjami używam komponentu innego producenta). Ta część działa świetnie w połączeniu z pakietem bezpieczeństwa JMS.Używanie Symfony2 AccessDeniedHandlerInterface

Teraz jestem w momencie, gdy chcę złapać użytkowników, którzy rzucają 403, więc mogę po prostu przekazać je do strony logowania komponentu strony trzeciej, którego używam. Myślę, że najlepiej jest dodać obsługę wyjątków do detektora wyjątków. Patrzę na AccessDeniedHandlerInterface.

  1. Czy to właściwy kierunek dla mnie?
  2. Jak dodać ten moduł obsługi do detektora wyjątku?

EDYTOWANIE: Skończyło się na zrobieniu czegoś podobnego. Stworzyłem usługę, która jest monitowana w zdarzeniu kernel.exception. services.yml wygląda następująco:

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

i self klasa to:

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

Odpowiedz

21

To brzmi o prawo.

Lub, jeśli jesteś szczególnie zainteresowany AccessDeniedException można również zdefiniować access_denied_handler obrębie zapory w security.yml:

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

Następnie określają swoje usługi w services.xml lub równoważne:

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

The klasa obsługi:

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

Pełne informacje na temat bezpieczeństwa Symfony2 można znaleźć tutaj: http://symfony.com/doc/2.8/reference/configuration/security.html