Как построить точку конечную точку JSON аутентификации

В этой записи, вы построите конечную точку JSON для входа ваших пользователей в систему. Конечно, когда пользователь выполняет вход, вы можете загружать ваших пользователей откуда угодно - например, БД. Смотрите 2b) The "User Provider", чтобы узнать больше.

Для начала, подключите вход JSON в вашем брандмауэре:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                anonymous: ~
                json_login:
                    check_path: /login
    
  • 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:srv="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <firewall name="main">
                <anonymous />
                <json-login check-path="/login" />
            </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(
            'main' => array(
                'anonymous'  => null,
                'json_login' => array(
                    'check_path' => '/login',
                ),
            ),
        ),
    ));
    

Tip

check_path также может быть именем маршрута (но не может иметь обязательных символов обобщения - например, /login/{foo} где foo не имеет значения по умолчанию).

Теперь, когда к URL /login будет сделан запрос, система безопасности инициирует процесс аутентификации. Вам просто надо сконфигурировать маршрут, совпадающий с этим путём:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // src/AppBundle/Controller/SecurityController.php
    
    // ...
    use Symfony\Component\HttpFoundation\Request;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    
    class SecurityController extends Controller
    {
        /**
         * @Route("/login", name="login")
         */
        public function loginAction(Request $request)
        {
        }
    }
    
  • YAML
    1
    2
    3
    4
    # app/config/routing.yml
    login:
        path:     /login
        defaults: { _controller: AppBundle:Security:login }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/routing.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
            http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="login" path="/login">
            <default key="_controller">AppBundle:Security:login</default>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // app/config/routing.php
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('login', new Route('/login', array(
        '_controller' => 'AppBundle:Security:login',
    )));
    
    return $collection;
    

Не дайте этому пустому контроллеру смутить вас. Когда вы отправляете запрос POST к URL /login со следующим JSON-документом в качестве тела, система безопасности останавливает запросы. Она заботится об аутентификации пользователя с отправленным именем пользователя и паролем или запускает ошибку в случае неудачи процесса аутентификации:

1
2
3
4
{
    "username": "dunglas",
    "password": "MyPassword"
}

Если JSON-документ имеет другую структуру, вы можете указать путь для доступа к свойствам username и password, используя ключи username_path и password_path (они по умолчанию username и password соответственно). Например, если JSON-документ имеет следующую структуру:

1
2
3
4
5
6
7
8
{
    "security": {
        "credentials": {
            "login": "dunglas",
            "password": "MyPassword"
        }
    }
}

То конфигурация безопасности должна быть:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    # app/config/security.yml
    security:
        # ...
    
        firewalls:
            main:
                anonymous: ~
                json_login:
                    check_path:    login
                    username_path: security.credentials.login
                    password_path: security.credentials.password
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- app/config/security.xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <srv:container xmlns="http://symfony.com/schema/dic/security"
        xmlns:srv="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <config>
            <firewall name="main">
                <anonymous />
                <json-login check-path="login"
                            username-path="security.credentials.login"
                            password-path="security.credentials.password" />
            </firewall>
        </config>
    </srv:container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    // app/config/security.php
    $container->loadFromExtension('security', array(
        'firewalls' => array(
            'main' => array(
                'anonymous'  => null,
                'json_login' => array(
                    'check_path' => 'login',
                    'username_path' => 'security.credentials.login',
                    'password_path' => 'security.credentials.password',
                ),
            ),
        ),
    ));
    

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