我正在编写一个带有ajax身份验证的ajax应用程序,现在我开始在silex中使用symfony安全组件来处理身份验证/授权。
使用简单配置进行简单测试,我通过防火墙进入受保护区域,我得到的响应是重定向到/login
页面,但我在应用程序中需要的是401响应,可能有其他信息(在header或json body中)如何登录。
$app['security.firewalls'] = [
'api' => [
'pattern' => '^/api',
'logout' => ['logout_path'=>'/auth/logout'],
'users' => $app->share(function(Application $app) {
return new MyUserProvider();
})
]
];
编辑:我有一个提示,但我不确定如何使用它。使用AuthenticationEntryPointInterface
实现入口点我可以告诉api如何回答未经身份验证的请求,并向用户提供进行身份验证所需的说明。这可能是我的401响应登录说明。
答案 0 :(得分: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
答案 1 :(得分: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