Почему не работает авторизация через json_login в отдельном правиле в Symfony 6.2?

Здравствуйте. Есть два правила firewall: login и main

security.yaml

firewalls:
        login:
            lazy: true
            login_throttling:
                max_attempts: 3
            pattern: ^/api/login
            custom_authenticator: App\Security\CustomAuthenticator
            provider: app_user_provider
            json_login:
                username_path: email
                password_path: password
                check_path: api_login
         main:
            login_throttling:
                max_attempts: 3
            lazy: true
            provider: app_user_provider
            custom_authenticator: App\Security\CustomAuthenticator
            json_login:
                check_path: api_login
                username_path: email
                password_path: password



ApiController

#[Route('/login', name: 'login', methods: ['POST'])]
    public function login(#[CurrentUser] ?User $user): Response
    {
        if (null === $user) {
            return $this->json([
                'message' => 'missing credentials',
            ], Response::HTTP_UNAUTHORIZED);
        }

        return $this->json(['user' => $user->getUserIdentifier()]);
    }



Если убрать правило login, и пускать авторизацию через main, то после отправки запроса я авторизован на сайте. Если же пускать запрос через правило login, то в дебагере так же видно, что я авторизован, но после обновления страницы я снова не авторизован.

Я решил сравнить создаваемые сессии, что в них хранится:

login
_sf2_attributes|a:1:{s:15:"_security_login";s:512:"O:74:"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":3:{i:0;N;i:1;s:5:"login";i:2;a:5:{i:0;O:15:"App\Entity\User":5:{s:19:"App\Entity\Userid";i:1;s:22:"App\Entity\Useremail";s:20:"admin@localhost.ru";s:22:"App\Entity\Userroles";a:1:{i:0;s:10:"ROLE_ADMIN";}s:25:"App\Entity\Userpassword";s:60:"$2y$13$WLWZckjG9pJtI9wxC5VA8.n1x90tH.qnEmIaffzZSn.V17cuvpG/m";s:27:"App\Entity\UserisVerified";b:1;}i:1;b:1;i:2;N;i:3;a:0:{}i:4;a:2:{i:0;s:10:"ROLE_ADMIN";i:1;s:9:"ROLE_USER";}}}";}_sf2_meta|a:3:{s:1:"u";i:1672638803;s:1:"c";i:1672638788;s:1:"l";i:604800;}

main
_sf2_attributes|a:2:{s:15:"_security_login";s:512:"O:74:"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":3:{i:0;N;i:1;s:5:"login";i:2;a:5:{i:0;O:15:"App\Entity\User":5:{s:19:"App\Entity\Userid";i:1;s:22:"App\Entity\Useremail";s:20:"admin@localhost.ru";s:22:"App\Entity\Userroles";a:1:{i:0;s:10:"ROLE_ADMIN";}s:25:"App\Entity\Userpassword";s:60:"$2y$13$WLWZckjG9pJtIJwxC5VA8.n1x90tH.qnEmIaffzZSn.V17cuvpG/m";s:27:"App\Entity\UserisVerified";b:1;}i:1;b:1;i:2;N;i:3;a:0:{}i:4;a:2:{i:0;s:10:"ROLE_ADMIN";i:1;s:9:"ROLE_USER";}}}";s:14:"_security_main";s:511:"O:74:"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":3:{i:0;N;i:1;s:4:"main";i:2;a:5:{i:0;O:15:"App\Entity\User":5:{s:19:"App\Entity\Userid";i:1;s:22:"App\Entity\Useremail";s:20:"admin@localhost.ru";s:22:"App\Entity\Userroles";a:1:{i:0;s:10:"ROLE_ADMIN";}s:25:"App\Entity\Userpassword";s:60:"$2y$13$WLWZckjG9pJtIJwxC5VA8.n1x90tH.qnEmIaffzZSn.V17cuvpG/m";s:27:"App\Entity\UserisVerified";b:1;}i:1;b:1;i:2;N;i:3;a:0:{}i:4;a:2:{i:0;s:10:"ROLE_ADMIN";i:1;s:9:"ROLE_USER";}}}";}_sf2_meta|a:3:{s:1:"u";i:1672638888;s:1:"c";i:1672638888;s:1:"l";i:604800;}

Разница в целой секции _security_main, которой нет, если авторизация идёт не через main. Что я упустил?

Видел похожий вопрос про ручную авторизацию, и токен _security_main добавлялся в сессию вручную. Для кастомных правил такого не видел, чтобы добавлялась эта секция
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
dmitrydeco
@dmitrydeco Автор вопроса
В общем для всех ищущих ответ. Каждое правило работает только в своей "юрисдикции", описанной в pattern. Если правило сделать для ^/api, то именно на этом роуте будет работать правило login. А так как я перехожу по ссылкам, не попадающим под правило (главная, например, либо страница логина /login, где, собственно, проходит авторизация), то из сессии не вытягивается токен, подходящий под правило login. Иными словами - firewall'ы работают только там, где вы написали в паттерне, больше нигде
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы