如何将防火墙限制于请求
当使用 Security 组件时,防火墙将根据请求匹配器的结果来决定是否处理请求:第一个匹配请求的防火墙将处理它。
最后一个防火墙可以配置为不使用任何匹配器,以处理每个传入的请求。
通过配置限制
大多数时候你不需要自己创建匹配器,因为 Symfony 可以根据防火墙配置为你完成。
注意
你可以单独使用以下任何限制,或将它们混合在一起以获得你想要的防火墙配置。
通过路径限制
这是默认的限制,它限制防火墙仅在请求路径与配置的 pattern
匹配时才初始化。
1 2 3 4 5 6 7 8
# config/packages/security.yaml
# ...
security:
firewalls:
secured_area:
pattern: ^/admin
# ...
pattern
是一个正则表达式。在这个例子中,防火墙只有在路径以 /admin
开头(由于 ^
正则表达式字符)时才会被激活。如果路径与此模式不匹配,则防火墙将不会被激活,后续的防火墙将有机会为该请求进行匹配。
通过主机限制
如果仅针对 pattern
进行匹配还不够,则还可以针对 host
进行请求匹配。当配置选项 host
设置后,防火墙将被限制为仅在请求中的主机与配置匹配时才初始化。
1 2 3 4 5 6 7 8
# config/packages/security.yaml
# ...
security:
firewalls:
secured_area:
host: ^admin\.example\.com$
# ...
host
(像 pattern
一样)是一个正则表达式。在这个例子中,防火墙只有在主机名完全等于(由于 ^
和 $
正则表达式字符)主机名 admin.example.com
时才会被激活。如果主机名与此模式不匹配,则防火墙将不会被激活,后续的防火墙将有机会为该请求进行匹配。
通过 HTTP 方法限制
配置选项 methods
将防火墙的初始化限制为提供的 HTTP 方法。
1 2 3 4 5 6 7 8
# config/packages/security.yaml
# ...
security:
firewalls:
secured_area:
methods: [GET, POST]
# ...
在这个例子中,防火墙只有在请求的 HTTP 方法是 GET
或 POST
时才会被激活。如果该方法不在允许的方法数组中,则防火墙将不会被激活,后续的防火墙将再次有机会为该请求进行匹配。
通过服务限制
如果以上选项不符合你的需求,你可以将任何实现了 RequestMatcherInterface 的服务配置为 request_matcher
。
1 2 3 4 5 6 7 8
# config/packages/security.yaml
# ...
security:
firewalls:
secured_area:
request_matcher: App\Security\CustomRequestMatcher
# ...