我是Silex的新手,我找不到如何更改SecurityServiceProvider以在3次连接错误后24小时限制访问。 身份验证工作完美。
非常感谢您的帮助和想法。
答案 0 :(得分:1)
您可以创建一个CustomAuthenticationFailureHandler
来扩展DefaultAuthenticationFailureHandler
。
创建一个类:
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler;
class CustomAuthenticationFailureHandler extends DefaultAuthenticationFailureHandler
{
/**
* (non-PHPdoc)
* @see \Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler::onAuthenticationFailure()
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
// create a failure counter for the access restriction
return $this->httpUtils->createRedirectResponse($request, $this->options['failure_path']);
}
}
分享这个课程:
$app['security.authentication.failure_handler.general'] = $app->share(function() use ($app) {
return new CustomAuthenticationFailureHandler($app['security.http_utils'], array(), $app);
});
此失败处理程序与名为 general 的防火墙匹配:
// init the firewall
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'general' => array(
'pattern' => '^/',
'anonymous' => true,
'form' => array(
'login_path' => '/login',
'check_path' => '/admin/login_check'
),
...
)
)
);
您还需要CustomAuthenticationSuccessHandler
扩展 DefaultAuthenticationSuccessHandler
:
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;
class CustomAuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler
{
/**
* (non-PHPdoc)
* @see \Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler::onAuthenticationSuccess()
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
// handle the 24 hour restriction for the user ...
return $this->httpUtils->createRedirectResponse($request, $this->determineTargetUrl($request));
}
}
并分享此课程:
$app['security.authentication.success_handler.general'] = $app->share(function () use ($app) {
return new CustomAuthenticationSuccessHandler($app['security.http_utils'], array(), $app);
});
希望这对你有帮助......
答案 1 :(得分:0)
感谢Ralf Hertsch给出了一个聪明的答案,但是当tekilatexee指出时,如果它扩展DefaultAuthenticationFailureHandler而不覆盖构造函数,则失败处理程序不接受HttpUtils实例作为构造函数的第一个参数。
此外,您不需要同时编写自定义处理程序(一个用于失败,一个用于成功),您只能链接一个失败处理程序,或者只能链接成功处理程序。
为了正确实现你的失败处理程序扩展Symfony的默认值,处理程序服务的正确定义是这样的:
$app['security.authentication.failure_handler.general'] = $app->share(function() use ($app) {
return new CustomAuthenticationFailureHandler($app['kernel'], $app['security.http_utils']);
});
这将Symfony \ Component \ HttpKernel \ HttpKernelInterface作为构造函数的第一个参数传递。
但是,如果你的自定义处理程序不是扩展Symfony的默认设置,而是实现Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface
,它只需要实现接收Symfony的Request对象{{1}的onAuthenticationFailure
。您可以传入构造函数,AuthenticationException
的实例来记录和检查以前的身份验证失败,或者任何其他自定义服务集。