Ошибка двухфакторной аутентификации при обновлении до 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);
    }

Вот ошибка

The "scheb_two_factor.security.google_authenticator" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.

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

Вы обновляли версию до 3.4?

Darragh Enright 27.10.2018 21:02

Было 3,4. Но я обновился с некоторым устареванием. Собственно проблема именно в этой строке.

Muhammad Shaaban 27.10.2018 21:04

"$ this-> container-> get (" scheb_two_factor.security.google_aut‌ henticator ") -> genera‌ teSecret ();"

Muhammad Shaaban 27.10.2018 21:05

Сейчас он устарел. Но я не знаю, как я могу реализовать это каким-то новым способом.

Muhammad Shaaban 27.10.2018 21:06

Я удалил свой ответ - я не заметил, что вы сказали, что уже используете 3.4. Поскольку вы сейчас используете 4.1, вы можете напрямую передать службу в действие, если это проводной. Запустите bin/console debug:autowiring и посмотрите, доступна ли служба в отображаемом списке. Если это так, просто передайте его как аргумент с подсказкой типа в действие. Например, для автоматической проводной службы Foo\BarService сделайте function twoFactorAction(Request $request, Foo\BarService $barService), и ее можно будет использовать в ваших действиях.

Darragh Enright 27.10.2018 21:12

Спасибо. Я использовал отладку bin / console: autowiring. Он не включал эту услугу. Могу ли я это сделать и как, если возможно. заранее спасибо

Muhammad Shaaban 27.10.2018 21:18

Интересно. Сделайте bin/console debug:autowiring | grep -i scheb на всякий случай. Какая версия schleb/two-factor-bundle у вас установлена? Вы должны увидеть это в своем composer.json.

Darragh Enright 27.10.2018 21:25

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

Darragh Enright 27.10.2018 21:27

Я использую версию 2.0 с уважением к windows

Muhammad Shaaban 27.10.2018 21:35

Здесь также путь к классу, который мне нужно использовать как подсказку типа

Muhammad Shaaban 27.10.2018 21:39

vendor \ Scheb \ TwoFactorBundle \ Security \ TwoFactor \ Provider \ Goo‌ gle \ GoogleAuthentica‌ tor

Muhammad Shaaban 27.10.2018 21:39

Вам приходилось вручную настраивать эту службу? Судя по документам 2.x, которые вы сделали. Если да, найдите эту конфигурацию (scheb_two_factor) и добавьте public: true

Darragh Enright 27.10.2018 21:40

Да, нашел. Он находится в scheb_two_factor.yamal. И это ошибки, потому что puplic keword не поддерживается

Muhammad Shaaban 27.10.2018 21:54

Хорошо, спасибо за обновление - подозревал, что не получится. Я отправлю ответ с вашими вариантами, как я их вижу.

Darragh Enright 27.10.2018 22:04

Спасибо уважаемый

Muhammad Shaaban 27.10.2018 22:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
15
645
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

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

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

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

обязательно укажите переменные, которые вы использовали, например $ request

Diego Garcia Sanchez 27.10.2018 21:31

На самом деле я немного использую старую связку. И не может обновляться по каким-то причинам. В старом пакете нет GoogleAuthenticatorInterface

Muhammad Shaaban 27.10.2018 21:33

Это правильный ответ, если OP использует версию 4, но я подозреваю, что это не так.

Darragh Enright 27.10.2018 21:34

Я только что видел ваш комментарий Мухаммад - вы не (и не можете) использовать последнюю версию. Это хорошо знать.

Darragh Enright 27.10.2018 21:36
Ответ принят как подходящий

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

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

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

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

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

Другие вопросы по теме