如何在Symfony2中创建IP黑名单?

Ond*_*ták 9 php symfony

是的,我知道食谱中选民教程.但我正在寻找一些略有不同的东西.我需要两个不同的黑名单层:

  1. 拒绝某些IP访问整个站点
  2. 拒绝某些IP登录

我写了Voter来检查用户的IP是否在数据库中.对于第一个场景,我编写了一个内核侦听器,它检查每个请求并在遇到被禁用户时抛出403:

if (VoterInterface::ACCESS_DENIED === $this->voter->vote($token, $this, array())) {
    throw new AccessDeniedHttpException('Blacklisted, punk!');
}
Run Code Online (Sandbox Code Playgroud)

第一个问题VoterInterface本身就是问题,迫使我使用TokenInterface $token,在这种情况下我并不需要.但我觉得这并不重要.接下来的事情是,我竟然不得不用AccessDeniedHttpExceptionAccessDeniedException总是试图重定向我到登录页面,并导致无休止的重定向循环在这种情况下.我和它一起生活,因为它在dev环境中工作得很好,但是当我切换到prod我在prod日志中继续获得503时:

[2011-11-21 20:54:04] security.INFO:用匿名令牌填充SecurityContext [] []

[2011-11-21 20:54:04] request.ERROR:Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException:黑名单,朋克!(未捕获的例外)在xxx第28行[] []

[2011-11-21 20:54:04] request.ERROR:处理异常时抛出异常(Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException:Blacklisted,punk!)[] []

从我所看到的,它可能是xdebug的问题,但即使我关闭它也会发生.我也试过香草\Exception,它做同样的事情.任何人都知道为什么会这样?或者可能是针对这种黑名单案例的其他解决方案.

另外,我不知道如何解决第二种情况,因为我不知道在获得令牌之前如何停止用户.我目前的解决方案是处理InteractiveLoginEvent,检查用户是否被列入黑名单,如果是,则删除他的令牌.它似乎并不安全,我对此并不满意.那么,任何想法如何解决这个问题?我想我只是错过了一些明显的"登录前事件".

MrG*_*ass 4

要拒绝访问整个网站,您可以调整用于保护开发环境的白名单代码。在 app.php 中粘贴类似这样的内容:

if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '1.2.3.4',))) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this site.');
}
Run Code Online (Sandbox Code Playgroud)