Как создавать и подключать пользовательские программы проверки пользователя

Как создавать и подключать пользовательские программы проверки пользователя

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

Создание пользовательской программы проверки пользователя

Программы проверки пользователя - это классы, которые должны реализовывать UserCheckerInterface. Этот интерфейс определяет два метода под названием checkPreAuth() и checkPostAuth() для выполнения проверок до и после аутентификации пользователя. Если не соблюдено одно или более условий, должно быть вызвано исключение, которое расширяет AccountStatusException.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace AppBundle\Security;

use AppBundle\Exception\AccountDeletedException;
use AppBundle\Security\User as AppUser;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class UserChecker implements UserCheckerInterface
{
    public function checkPreAuth(UserInterface $user)
    {
        if (!$user instanceof AppUser) {
            return;
        }

        // пользователь удалён, показать общее сообщение "Учётная запись не найдена"
        if ($user->isDeleted()) {
            throw new AccountDeletedException('...');
        }
    }

    public function checkPostAuth(UserInterface $user)
    {
        if (!$user instanceof AppUser) {
            return;
        }

        // учётная запись пользователя недействительна, можно уведомить пользователя
        if ($user->isExpired()) {
            throw new AccountExpiredException('...');
        }
    }
}

Подключение пользовательской программы проверки пользователя

Далее, убедитесь в том, что ваша программа проверки пользователя зарегистрирована, как сервис. Если выиспользуете конфигурацию services.yml по умолчанию, то сервис регистрируется автоматически.

Всё, что остаётся сделать, это добавить программу проверки к желаемому брандмауэру, где значением будет id сервиса вашей программы проверки:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # app/config/security.yml
    
    # ...
    security:
        firewalls:
            main:
                pattern: ^/
                user_checker: AppBundle\Security\UserChecker
                # ...
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- 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="main" pattern="^/">
                <user-checker>AppBundle\Security\UserChecker</user-checker>
                <!-- ... -->
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    // app/config/security.php
    
    // ...
    use AppBundle\Security\UserChecker;
    
    $container->loadFromExtension('security', array(
        'firewalls' => array(
            'main' => array(
                'pattern' => '^/',
                'user_checker' => UserChecker::class,
                // ...
            ),
        ),
    ));
    

Tip

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

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