Silex身份验证 - 在3次错过尝试后限制访问

时间:2014-02-27 13:38:13

标签: silex

我是Silex的新手,我找不到如何更改SecurityServiceProvider以在3次连接错误后24小时限制访问。 身份验证工作完美。

非常感谢您的帮助和想法。

2 个答案:

答案 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的实例来记录和检查以前的身份验证失败,或者任何其他自定义服务集。