Symfony2:如何通过 IP 地址限制/拒绝访问某些路由?

Symfony2: How to restrict / deny access to certain routes by IP address?

如果客户端的 IP 地址已被禁止,我想禁止访问 /login/register

禁止 IP 的(黑)名单存储在数据库中。

我该如何解决这个问题?

使用控制器事件(首选)

您可以在注册控制器上订阅事件。

报名可订阅REGISTRATION_INITIALIZE活动

这是 controller events 的文档。

覆盖控制器方法

第二个解决方案是 override login and register controller methods,但您必须复制 login/register 操作的所有代码。

从 symfony 2.4 开始,您可以在配置文件中使用 Expression Language Component

现在实施简单的 IP 检查很容易:

  • 创建一个服务(即access_manager),使用一种方法(即getBannedIPs())从您的存储层获取被禁止的 IP 列表
  • 向您的安全配置添加一个表达式,将返回的数组与客户端的 IP 地址进行比较
  • 就是这样。

例子

# app/config/security.yml
security:
    # ...
    access_control:
        - path: ^/(login|register)$
          allow_if: "request.getClientIp() not in @=service('access_manager').getBannedIPs()"