使用Symfony2的AccessDeniedHandlerInterface

时间:2012-02-06 20:38:23

标签: security authentication symfony

我正在尝试为symfony2安装我的安全设备,到目前为止我已经开始工作,但现在我需要做一些更奇特的事情。我目前正在使用处理PreAuthentication的所有内容(我使用第三方组件进行登录和会话管理)。该部分与JMS安全捆绑包一起工作很好。

现在我想要抓住投掷403s的用户,以便我可以将它们转发到我正在使用的第三方组件的登录页面。我认为我最好的办法是在异常监听器中添加一个异常处理程序。我正在查看AccessDeniedHandlerInterface

  1. 这是我走向正确的方向吗?
  2. 如何将此处理程序添加到异常侦听器?
  3. 编辑: 我最终做了类似的事情。我创建了一个在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 个答案:

答案 0 :(得分: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>

处理程序类:

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