Middleware firewall
Middleware firewall - это механизм брандмауэра Symfony,
который перехватывает каждый HTTP-запрос до вызова контроллера
и запускает процесс аутентификации. Брандмауэр определяет,
какие маршруты защищены, какие аутентификаторы применяются
и как формируется объект Passport. Первым параметром
в конфигурации указывается имя брандмауэра, затем - шаблон
URL pattern, список authenticators и
настройки entry_point.
Синтаксис
security:
firewalls:
main:
pattern: ^/
stateless: false
provider: users_in_memory
entry_point: App\Security\LoginAuthenticator
authenticators:
- App\Security\LoginAuthenticator
Пример
Давайте настроим простой брандмауэр для защиты всех маршрутов через пользовательский аутентификатор:
security:
providers:
users_in_memory:
memory:
users:
user:
password: '$2y$13$abcde'
roles: ['ROLE_USER']
firewalls:
main:
pattern: ^/
provider: users_in_memory
authenticators:
- App\Security\ApiAuthenticator
Пример
Теперь создадим класс аутентификатора, который брандмауэр будет вызывать на каждом запросе:
<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
class ApiAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->headers->has('X-AUTH-TOKEN');
}
public function authenticate(Request $request): Passport
{
$token = $request->headers->get('X-AUTH-TOKEN');
return new SelfValidatingPassport(
new UserBadge($token),
[
new CsrfTokenBadge('authenticate', $token),
]
);
}
public function onAuthenticationSuccess(Request $request, $token, string $firewallName): ?Response
{
return null;
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
{
return new Response('auth failed', Response::HTTP_UNAUTHORIZED);
}
}
?>
Пример
Давайте проверим работу брандмауэра через консольную команду, которая выводит список брандмауэров:
php bin/console debug:firewall main
Результат выполнения команды:
"main: pattern=^/ authenticators=App\Security\ApiAuthenticator entry_point=none"
Пример
Давайте настроим несколько брандмауэров для разных разделов сайта:
security:
firewalls:
api:
pattern: ^/api
stateless: true
authenticators:
- App\Security\ApiAuthenticator
main:
pattern: ^/
provider: users_in_memory
form_login:
login_path: app_login
check_path: app_login
Смотрите также
-
класс
Passport,
который хранит пользователя и бейджи аутентификации -
класс
AbstractAuthenticator,
который является базой для всех аутентификаторов -
класс
SelfValidatingPassport,
который подтверждает пользователя без пароля -
раздел
access-control,
который ограничивает доступ по ролям