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()"
如果客户端的 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()"