Ошибка двухфакторной аутентификации при обновлении до symfony 4.1

Вот мой пример кода

/**
* @Route("/two/factor", name="google-authenticator")
*/
public function twoFactorAction(Request $request)
{
$user = $this->getUser();
$secret = $this->container->get("scheb_two_factor.security.google_authenticator")->generateSecret();
$user->setGoogleAuthenticatorSecret($secret);
$url = null;
if(!empty($user->getGoogleAuthenticatorSecret())){
$url = $this->container->get("scheb_two_factor.security.google_authenticator")->getUrl($user);
}

Вот ошибка

Сервис или псевдоним scheb_two_factor.security.google_authenticator был удален или встроен во время компиляции контейнера. Вам следует либо сделать его общедоступным, либо прекратить использование контейнера напрямую и использовать вместо него внедрение зависимостей.

Это было прекрасно работает. Но после обновления с symfony 3.4 до 4.1 я получаю эту ошибку. Пожалуйста, дайте мне знать, как я могу исправить это быстро, уважаемый.

1

Решение

Как уже говорилось, Symfony 4.1 позволяет вам внедрять автоматические проводные сервисы в действия вашего контроллера и в других местах. Однако вы используете более старую (2.x) версию scheb/two-factor библиотека, которая не определяет автоматические услуги.

Поскольку вы не можете обновить до 4.x этой библиотеки, вы несколько ограничены в своих возможностях. Однако должно быть возможно добавить Compiler Pass изменить scheb/two-factor Конфигурация библиотеки в соответствии с вашими потребностями.

Короче говоря, Compiler Pass должен позволить вам переопределить эту службу как общедоступную, выполнив что-то вроде этого:

$container
->getDefinition('scheb_two_factor.security.google_authenticator')
->setPublic(true);

Вам придется обратиться к документация чтобы узнать, как внедрить компилятор в ваше приложение.

0

Другие решения

Вы не можете использовать из контейнера больше, потому что модификаторы доступа. Попробуйте использовать автопроводку.

Вы можете использовать этот интерфейс GoogleAuthenticatorInterface

Он поставляется из того же пакета, который вы используете в настоящее время: Scheb
И есть это пространство имен:

Scheb\TwoFactorBundle\Security\TwoFactor\Provider\Google\GoogleAuthenticatorInterface;

Ваш метод выглядит так:

public function index(GoogleAuthenticatorInterface $twoFactor)
{
// ...
$secret = $twoFactor->generateSecret();
}

Я надеюсь, что эта страница может помочь вам немного больше, если я не понял. порождающий секрет

0

По вопросам рекламы [email protected]