Обновление Symfony 3.4 нарушило тест PHPUnit при тестировании SSO PreAuthenticationToken

Я обновляю свое приложение Symfony 2.8 до 3.4, и у меня возникают некоторые проблемы с существующим тестом PHPUnit.

Это мой security.yml:

security:
   firewalls:
        default:
            simple_preauth:
                provider: fos_userbundle
                authenticator: appbundle.admin.tokenauthenticator

Я недавно обновил friendsofsymfony/user-bundle до v2.1.2 как часть этого обновления Symfony 3.4.

config_test.yml (для PHPUnit):

security:
    providers:
        appbundle.security.api.key_user_provider:
            apiusers:
                users:
                    server:
                        apikey: testUserValidRole
                        roles:
                            - 'ROLE_API_USER'

Я также обновил PHP до 7.2 и PHPUnit до 7.4.3.

В моем тесте у меня есть это:

$crawler = $client->request('POST', '/api/sso', [
    'apikey' => 'testUserValidRole',
    'site' => $site->getId(),
]);

$this->assertEquals(
     \Symfony\Component\HttpFoundation\Response::HTTP_OK,
     $client->getResponse()->getStatusCode()
);

$response = json_decode($client->getResponse()->getContent());
$this->assertTrue(isset($response->target));

$security = $client->getProfile()->getCollector('security');

// The user should only be authenticated anonymously.
$this->assertTrue($security->isAuthenticated());
$this->assertEquals(
     'Symfony\Component\Security\Core\Authentication\Token\AnonymousToken',
     $security->getTokenClass()
);

// Check that we can login with a valid loginToken.
// Note: A successful login will redirect and remove the loginToken.
$client->enableProfiler();
$crawler = $client->request('GET', $response->target);

// The user should be authenticated correctly.
$security = $client->getProfile()->getCollector('security');
$this->assertTrue($security->isAuthenticated());
$this->assertEquals(
    'Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken',
    $security->getTokenClass()
);

Последнее утверждение на PreAuthenticatedToken терпит неудачу, и PHPUnit выдает ошибку:

Не удалось подтвердить, что Symfony \ Component \ VarDumper \ Cloner \ Data Object & 00000000299a8bd300000000690a732b соответствует ожидаемому 'Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken'.

Полный вывод находится здесь: https://gist.github.com/crmpicco/a927716570a4949caafec4ca1361bf63

Я не вижу ничего в разделе безопасности в примечаниях к обновлению Symfony, что указывало бы на причину этой ошибки, и я должен признать, что сейчас я немного озадачен этой ошибкой. Есть ли у меня неправильная конфигурация?


person crmpicco    schedule 01.11.2018    source источник
comment
Видите ли вы какие-либо другие ошибки или устаревания в своем приложении / журналах / test.log?   -  person dbrumann    schedule 01.11.2018


Ответы (1)


Я не знаю точно причины, но кажется, что SecurityDataCollector::getTokenClass() возвращает строку только тогда, когда класс Symfony\Component\VarDumper\Caster\ClassStub не существует (т.е. VarDumper не загружен / не установлен), как вы можете видеть здесь.

Поэтому вы должны вызвать $security->getTokenClass()->getValue(), чтобы получить строковое значение, или лучше преобразовать его в строку, чтобы избежать ошибок, когда getTokenClass() уже возвращает строку:

$this->assertEquals(
    'Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken',
    (string) $security->getTokenClass()
);
person DrKey    schedule 01.11.2018
comment
Спасибо, но это просто преобразует результат getTokenClass в AnonymousToken, когда он должен быть PreAuthenticatedToken. - person crmpicco; 01.11.2018
comment
Ну, это то, чего я не могу понять, это связано с самим тестом и системой, стоящей за ним ... - person DrKey; 01.11.2018