如何在 Symfony 中创建 "catch-all" 防火墙?

How can I create a "catch-all" firewall in Symfony?

我们有一个仅对特定主机有效的 Symfony 防火墙。当用户向受此防火墙保护的页面发出请求时,我们正在捕获请求并执行正确的 approval/deny/ask 登录步骤。

大致看起来像这样(删除了一些位)并允许此防火墙使用我们的-domain.com 和直接子域。

        main:
            pattern:   ^/.*
            form_login: ...
            anonymous: true
            host: '^((([^.])+\.)?our-domain\.com)$'
            guard: ...

但是,我们发现一个(厚颜无耻的)人偶尔会访问其中一个 URL,但访问的是不同的主机,例如IP 地址或不同的域。由于防火墙与该主机不匹配,我们得到以下异常:

The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL.

我们正在探索不同的方法来阻止对“不允许的”主机的请求,但我们尚未找到合适的答案。

一个似乎正确的选项是“拒绝所有”或“捕获所有其他”类型的防火墙 - 我们可以说“如果您不匹配任何其他防火墙,则将其视为不允许” .

有没有办法在 Symfony 中做到这一点?

如果你执行 bin/console debug:router 你会得到类似这样的输出:

Name              Method   Scheme   Host   Path
----------------  -------  -------  -----  --------------------------------------------
homepage          ANY      ANY      ANY    /
contact           GET      ANY      ANY    /contact

如您所见,默认情况下,所有 URI 都可以在您的网络服务器配置可访问的所有主机上访问。

如果你想将它们限制到给定的主机和 return 404,你可以在路由配置中使用 host parameter

为避免必须将参数添加到每个 @Route 注释,您可以通过 yaml 全局配置它:

# config/routes/annotations.yaml
controllers:
    resource: '../../src/Controller/'
    type: annotation
    host: '^((([^.])+\.)?our-domain\.com)$'