【问题标题】:Symfony2: How to restrict / deny access to certain routes by IP address?Symfony2:如何通过 IP 地址限制/拒绝对某些路由的访问?
【发布时间】:2015-03-28 22:12:09
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: symfony fosuserbundle access-control


    【解决方案1】:

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

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

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

    示例

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

    【讨论】:

    • 你说得对,但是如果我想用消息通知用户怎么办?
    • 我尝试提供最简单的解决方案...但是对于这种高级情况,您必须添加一个与 IP 匹配的 kernel.request 侦听器并将 flashmessage 添加到会话 flashbag ... 或只是对三元运算符和添加 flashmessage 并始终返回 true 的条件有点棘手....( request.getClientIp() not in @=service('access_manager').getBannedIPs() ) ? ( @=service('session').getFlashBag().add('warning', 'You have been banned.') != false ) : false。明白了吗?
    • 好的,谢谢!直到现在我从未使用过表达式,但我将开始与它们一起玩,以发现它们的使用限制以及它们可以比其他解决方案更好或更简单的地方。
    • 我已经尝试过这个解决方案,但我在 security.yml 中收到错误 Unexpected character "@"
    【解决方案2】:

    使用控制器事件(首选)

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

    报名请订阅REGISTRATION_INITIALIZE活动。

    这是controller events 的文档。

    重写控制器方法

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

    【讨论】:

    • 不需要事件监听器或控制器覆盖来解决这个问题。只需使用 security.ymlaccess_control 下的表达式语言组件即可。看我的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多