allow_if 语句中无法解析的 IP 列表

Unparse-able list of IPs in allow_if statement

我有以下安全配置:

security:

    # .....

    access_control:
        -
            path: ^/path/to/resource
            allow_if: "request.getClientIp() in %my.ips%"

parameters:
    my.ips:
        - '129.0.0.1'
        - '55.12.99.100'

基本上我想 allow/deny 基于 IP 列表。

此 IP 列表根据某些业务规则和环境(测试、开发、生产等)保持 changing/growing/shrinking。这就是为什么我必须在 allow_if 规则中这样写。我不能只做 ip=X or ip=Y or ip=Z or....

这样的事情

现在,这不起作用。我收到如下错误:

A string value must be composed of strings and/or numbers, but found parameter "my.ips" of type array inside string value.

我尝试了各种组合,例如:

allow_if: "request.getClientIp() in '%my.ips%'"

allow_if: "request.getClientIp() in ['%my.ips%']"

...

我也遇到了同样的错误。

我怀疑这是使用 Expression-Language 组件进行解析和解释的。因此,根据here描述的语法,我也这样尝试:

allow_if: "request.getClientIp() in parameter('my.ips')"

但它再次失败并出现错误:

The function "parameter" does not exist around position 26.

现在我有点卡住了。有什么方法可以让这项工作成功吗?

好的,所以我无法使表达式 parse/accept 成为常规参数,但我可以解决它。

这是我所做的:

security:

    # .....

    access_control:
        -
            path: ^/path/to/resource
            ips: '%my.ips%'
            roles: ['ROLE_MY_ROLE']

        -
            path: ^/path/to/resource
            allow_if: 'false'

parameters:
    my.ips:
        - '129.0.0.1'
        - '55.12.0.0/16'

所以它的工作方式是这样的:

  • 尝试匹配第一个 access-control-entry。
  • 当我拥有这些 IP 之一时,请检查我是否访问了正确的路径
  • 如果是,请检查我是否具有这些角色之一
  • 如果我的路径或我的 IP 不匹配,则转到第 2 个条目
  • 如果路径相同,则拒绝访问(因为 allow_if 始终是 false

因此,只有当用户来自特定 IP 并且他具有允许的角色之一时,用户才有义务访问该路由。

我发现的一件有趣的事情是,您可以使用子网作为允许的 IP 列表,这真的很酷,因为这意味着您也可以在其中添加 IP 范围。也许这应该添加到文档中,因为它非常有用(我有空时会在 GitHub 上进行 PR)。