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)。
我有以下安全配置:
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)。