Как ограничить брандмауэры по конкретному запросу

Как ограничить брандмауэры по конкретному запросу

Используя компонент Безопасности, вы можете создавать брандмауэры, которые совпадают с определёнными опциями запроса. В большинстве случаев, достаточно сопоставления с URL, но в особенных случаях, вы можете больше ограничить инициализацию брандмауэра с другими опциями запроса.

Note

Вы можете использовать любые из этих ограничений по отдельности или смешивать их, чтобы получить желаемую конфигурацию брандмауэра.

Ограничение по шаблону (pattern)

Это ограничение по умолчанию, которое ограничивает брандмауэр так, чтобы он был инициализирован только, если URL запроса совпадает со сконфигурированным pattern.

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    # app/config/security.yml
    
    # ...
    security:
        firewalls:
            secured_area:
                pattern: ^/admin
                # ...
    
  • XML
     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>
    
  • PHP
     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 недостаточно, то запрос можно также сопоставить с host. Когда установлена опция конфигурации host, брандмауэр будет ограничен так, чтобы запускаться только если хост запроса совпадает с конфигурацией.

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    # app/config/security.yml
    
    # ...
    security:
        firewalls:
            secured_area:
                host: ^admin\.example\.com$
                # ...
    
  • XML
     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>
    
  • PHP
     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-методам

Опция конфигурации methods ограничивает инициализацию брандмауэра по предоставленным HTTP-методам.

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    # app/config/security.yml
    
    # ...
    security:
        firewalls:
            secured_area:
                methods: [GET, POST]
                # ...
    
  • XML
     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>
    
  • PHP
     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-метод запроса - GET или POST. Если этого метода нет в массиве разрешённх методов, то брандмауэр не будет активирован, и последующие брандмауэры будут иметь возможность быть сопоставлеными с этим запросом.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.