3

对于使用 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();
    }
}
4

1 回答 1

2

您使用了身份验证而不是授权这个词,不幸的是,这似乎还没有写出来。因此,您可能需要创建自己的。

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

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

有关提供授权侦听器的更改集,请参见 pull #308。有关如何配置侦听器的文档,请参阅安全异常侦听器。

于 2013-03-26T18:11:52.687 回答