Использование Symfony2 AccessDeniedHandlerInterface - PullRequest
15 голосов
/ 07 февраля 2012

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

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

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

РЕДАКТИРОВАТЬ: я закончил делать что-то подобное.Я создал сервис, который запрашивается в событии 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.
    }
  }
}

1 Ответ

21 голосов
/ 07 февраля 2012

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

Или, если вы особенно заинтересованы в 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>

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...