2012-02-06 2 views
15

Я пытаюсь настроить свою настройку безопасности для symfony2, и у меня она работает до сих пор, но теперь мне нужно сделать еще несколько причудливых вещей. В настоящее время я использую все, что связано с PreAuthentication (я использую сторонний компонент для входа в систему и управления сеансом). Эта часть отлично работает в сочетании с комплектом безопасности JMS.Использование Symfony2's AccessDeniedHandlerInterface

Теперь я к тому моменту, когда хочу поймать пользователей, которые бросают 403s, поэтому я могу просто переслать их на страницу входа в систему стороннего компонента, который я использую. Я считаю, что лучше всего добавить обработчик исключений для прослушивателя исключений. Я смотрю на AccessDeniedHandlerInterface.

  1. Это правильное направление для меня?
  2. Как добавить этот обработчик в прослушиватель исключений?

EDIT: В итоге я сделал что-то подобное. Я создал службу, которая запрашивается в событии kernel.exception. services.yml выглядит следующим образом:

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

Это звучит о праве.

Или, если вы заинтересованы в специально AccessDeniedException вы можете также определить access_denied_handler в брандмауэре в security.yml:

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> 

The класс обработчика:

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

Смежные вопросы