11

我正在编写一个带有 ajax 身份验证的 ajax 应用程序,现在我开始使用 silex 中的 symfony 安全组件来处理身份验证/授权。
用简单的配置做一个简单的测试,我去防火墙旁边的一个保护区,我得到的响应是重定向到/login页面,但我的应用程序中需要的是一个 401 响应以及可能的附加信息(在标题或 json 正文中) 关于如何登录。

$app['security.firewalls'] = [
    'api' => [
        'pattern' => '^/api',
        'logout' => ['logout_path'=>'/auth/logout'],
        'users' => $app->share(function(Application $app) {
            return new MyUserProvider();
        })
    ]
];

编辑:我得到了一个提示,但我不知道如何使用它。实现一个入口点,AuthenticationEntryPointInterface我可以告诉 api 如何回答未经身份验证的请求并为用户提供身份验证所需的指令。那可能是我带有登录说明的 401 响应。

4

2 回答 2

6

您需要的是一个 AuthenticationEntryPoint 处理程序。简单的例子:

class AuthenticationEntryPoint implements AuthenticationEntryPointInterface {

/**
 * Starts the authentication scheme.
 *
 * @param Request $request The request that resulted in an AuthenticationException
 * @param AuthenticationException $authException The exception that started the authentication process
 *
 * @return Response
 */
public function start(Request $request, AuthenticationException $authException = null)
{
    $array = array('success' => false);
    $response = new Response(json_encode($array), 401);
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}
}

在 services.xml 文件中将类注册为服务:

<parameters>
    <parameter key="authentication_entry_point.class">YourNameSpace\AuthenticationEntryPoint</parameter>
</parameters>

<services>
    <service id="authentication_entry_point" class="%authentication_entry_point.class%"/>
</services>

并在 security.yml 文件中做一个小改动:

security:
  firewalls:
    somename:
      entry_point: authentication_entry_point
于 2014-01-08T12:12:51.277 回答
1

我能够覆盖“api”防火墙下“form”类型的默认入口点,如下所示:

$app['security.entry_point.api.form'] = $app->share(function () use ($app) {
    return new MyAuthenticationEntryPoint();
});

那么这只是实现AuthenticationEntryPointInterface的问题:

http://symfony.com/doc/current/components/security/firewall.html#entry-points

看看 symfony 的实现来了解一下:

Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint

此外,可能值得查看 silex 安全服务提供商,看看他们如何将其注入默认实现的“security.entry_point.form._proto”。

Silex\Provider\SecurityServiceProvider
于 2014-04-26T14:40:11.440 回答