> Symfony中文手册 > 如何限定防火墙使其只允许通过指定请求

如何限定防火墙使其只允许通过指定请求

使用Security组件时,你可以创建“匹配了特定请求选项”的防火墙。多数情况下,仅匹配URL就可够了,但在特殊情况下,你需要“针对请求的其他选项”来进一步限制防火墙的初始化。

你可以单独使用任何一个限制条件,或者将其混用,来得到你想要的防火墙配置。

通过Pattern(正则条件)限制 ¶

这是默认的制约和限制方式,如果请求URL和配置的pattern相匹配,那么防火墙被初始化。

1
2
3
4
5
6
7
8
# app/config/security.yml
 
# ...
security:
    firewalls:
        secured_area:
            pattern: ^/admin
            # ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- app/config/security.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<srv:container xmlns="Http://symfony.com/schema/dic/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:srv="http://symfony.com/schema/dic/services"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <config>
        <!-- ... -->
        <firewall name="secured_area" pattern="^/admin">
            <!-- ... -->
        </firewall>
    </config>
</srv:container>
1
2
3
4
5
6
7
8
9
10
11
// app/config/security.php
 
// ...
$container->loadFromExtension('security', array(
    'firewalls' => array(
        'secured_area' => array(
            'pattern' => '^/admin',
            // ...
        ),
    ),
));

pattern 是一个正则表达式。本例中,如果URL以 /admin 为开始(因为 ^ 正则字符),防火墙将被激活。如果URL不匹配此pattern,防火墙就不会被激活,在它后面的防火墙将有机会来匹配这一请求。

通过主机名限制 ¶

如果仅匹配 pattern 还不够的话,请求也可以针对 host 进行匹配。当配置选项中的 host 被设置,防火墙将为限制为仅在“请求中的主机名与配置信息相匹配”时才初始化。

1
2
3
4
5
6
7
8
# app/config/security.yml
 
# ...
security:
    firewalls:
        secured_area:
            host: ^admin\.example\.com$
            # ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- app/config/security.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<srv:container xmlns="http://symfony.com/schema/dic/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:srv="http://symfony.com/schema/dic/services"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <config>
        <!-- ... -->
        <firewall name="secured_area" host="^admin\.example\.com$">
            <!-- ... -->
        </firewall>
    </config>
</srv:container>
1
2
3
4
5
6
7
8
9
10
11
// app/config/security.php
 
// ...
$container->loadFromExtension('security', array(
    'firewalls' => array(
        'secured_area' => array(
            'host' => '^admin\.example\.com$',
            // ...
        ),
    ),
));

host(类似于pattern)是正则表达式。本例中,如果主机名完全符合 admin.example.com(因 ^$ 正则字符),防火墙将被激活。如果主机名不匹配此条件,防火墙不会被激活,后面的防火墙将有机会来匹配这一请求。

通过HTTP Method限制 ¶

配置信息中的 methods 选项,根据所提供HTTP方法来,来限制防火墙的初始化。

1
2
3
4
5
6
7
8
# app/config/security.yml
 
# ...
security:
    firewalls:
        secured_area:
            methods: [GET, POST]
            # ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- app/config/security.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<srv:container xmlns="http://symfony.com/schema/dic/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:srv="http://symfony.com/schema/dic/services"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <config>
        <!-- ... -->
        <firewall name="secured_area" methods="GET,POST">
            <!-- ... -->
        </firewall>
    </config>
</srv:container>
1
2
3
4
5
6
7
8
9
10
11
// app/config/security.php
 
// ...
$container->loadFromExtension('security', array(
    'firewalls' => array(
        'secured_area' => array(
            'methods' => array('GET', 'POST'),
            // ...
        ),
    ),
));

本例中,仅当请求中的HTTP方法是 GETPOST,防火墙才被激活。如果请求的方法不在允许方法的数组中,则防火墙不会被激活,后面的防火墙将有机会来匹配这一请求。