Symfony2防火墙和FOSRestBundle

时间:2013-03-25 17:19:16

标签: symfony fosrestbundle

对于使用FOSRestBundle的我的Web服务,我创建了一个强制登录访问应用程序的防火墙。

我的问题是,当我通过ajax调用API时,我需要在用户未经过身份验证时获取错误代码401,而不是接收登录表单的html源代码。如何配置应用程序?

secured_area:
            pattern:    ^/
            form_login:
                provider: fos_userbundle
                use_forward: false
                default_target_path: /w
            logout:
                path:   /logout
                target: /login

修改

感谢Ryan,这里是KernelExceptionListener方法。

public function onKernelException( GetResponseForExceptionEvent $event ) {
    // get exception
    $exception = $event->getException();
    // get path
    $path = $event->getRequest()->getPathInfo();

    if ( $exception instanceOf AuthenticationException && ($event->getRequest()->isXmlHttpRequest() || strpos( $path, '/api' ) === 0) ) {
        $response = new Response();
        $response->setStatusCode( 401 );
        $event->setResponse( $response );
        $event->stopPropagation();
    }
}

1 个答案:

答案 0 :(得分:2)

您使用了身份验证而非授权,遗憾的是,这似乎并未写入。因此,您可能需要创建自己的。

在一般情况下,应创建一个简单的Kernel Event listener来拦截AuthenticationException异常。捕获此事件应该允许您在重定向到登录页面之前执行您喜欢的任何操作。

FOSRestBundle应该提供一个如何做到这一点的好例子。 FOSRestBundle为当前授权层(AccessDeniedException)提供此功能。通过一些修改,相同的框架也应该为身份验证层提供相同的功能。

有关提供授权侦听器的更改集,请参阅pull #308。 有关如何配置侦听器的文档,请参阅Security Exception Listener