@EVOSandru6

Как правильно в symfony 5.3.6 security использовать CustomAuthentifer и не поломать тестовый loginUser?

Всем привет!

Проблема получения информации об авторизованном юзере.

Когда я удаляю блок main в security.yaml, то фрагмент теста $this->client->loginUser($testUser)
отрабатывает адекватно и AccountController::getUser() возвращает User - а как и должен.

Но если блок main раскомментить, То целевой роут возвращает null вместо ожидаемого юзера =(((

Ниже подробнее:

Есть конфиг security.yaml:

security:
  enable_authenticator_manager: true
  encoders:
    App\Model\User\Entity\User\User:
      algorithm: bcrypt
  providers:
    app_user_provider:
      entity:
        class: App\Model\User\Entity\User\User
        property: email
  firewalls:
    dev:
      pattern: ^/(_(profiler|wdt)|css|images|js)/
      security: false
    main:
      provider: app_user_provider
      custom_authenticators:
        - App\Security\LoginFormAuthenticator
  access_control:


Есть кастумный аутентификатор: LoginFormAuthenticator:

namespace App\Security;

class LoginFormAuthenticator extends AbstractAuthenticator {
...


Есть тест для получения информации о пользователе:

class UserinfoTest extends DbWebTestCase
{
    private const API_PREFIX = '/api/v1';

    protected function setUp(): void
    {
        $this->client = static::createClient();
        $this->client->disableReboot();
        $this->em = static::getContainer()->get('doctrine')->getManager();
    }

    public function test_userinfo_success()
    {
       
        $userRepository = $this->em->getRepository(User::class);
        $testUser = $userRepository->findOneBy(['email' => 'black.jack@mail.ru']);
        $this->client->loginUser($testUser);
        $this->client->request('GET', self::API_PREFIX . '/account/userinfo');
         ...
    }
}


И сам AccountController куда тест ходит:

namespace App\Controller\Api\V1\Account;

#[Route('api/v1/account')]
class AccountController extends BaseController
{
    #[Route('/userinfo')]
    public function userInfo(): JsonResponse
    {
        $user = $this->getUser();

        return $this->json([
            'code' => 200,
            'data' => [
                'user' => [
                    'username' => (string)$user->getUsername(),
                ]
            ]
        ], 200, []);
    }

    protected function getUser(): User
    {
        return parent::getUser();  // !!!!!!!!! ПРОБЛЕМА ТУТ
    }
}


И сам User:

namespace App\Model\User\Entity\User;

class User implements UserInterface, UserLoaderInterface, UserProviderInterface {
...


Подскажите пожалуйста - как сохранить аутентификатор и возможность в тесте авторизовывать юзера через loginUser?
  • Вопрос задан
  • 166 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы