Можно ли внедрить службу поставщика пользователей текущего брандмауэра в пользовательскую службу?

Я столкнулся с хорошей проблемой в одном из моих проектов.

Мне нужно внедрить User Provider, определенный для брандмауэра, в службу стороннего пакета, который я разрабатываю. Я не могу определить это явно в своей службе, потому что я хочу добиться этого, когда служба вызывается из другого брандмауэра или пользователь меняет поставщика в security.yaml, моя служба адаптируется для использования правильного поставщика.

Что мне удалось сделать, так это получить только имя провайдера, введя RequestStack и FirewallMap и получив FirewallConfig, используя текущий запрос, но не более того, просто имя.

Интересно, есть ли способ сделать это. В документах по этому поводу ничего нет. Но я уверен, что должен быть способ, поскольку прослушиватели аутентификации в Security Bundle делают то же самое.

Читаю ваши умные ответы! :)


person Matías Navarro Carter    schedule 10.05.2018    source источник
comment
Какой релиз вы используете? 4.0?   -  person Leon Willens    schedule 11.05.2018
comment
Да. Я использую 4.   -  person Matías Navarro Carter    schedule 11.05.2018


Ответы (1)


Вы пробовали заглянуть в класс FirewallConfig? Он не очень хорошо задокументирован, но он существует, и к нему можно получить доступ через $firewallMap->GetFirewallConfig($request). В этом объекте хранится вся информация о брандмауэре, а также о провайдере ($firewallConfig->getProvider()).

Если вам удалось внедрить конфигурацию FirewallMap, я думаю, вы также можете передать текущий объект Request в качестве параметра для получения FirewallConfig:

public class YourService()
{
    ...
    public function YourMethod(Request $request)
    {
        // Your FirewallMap injection
        ...

        $firewallConfig = $firewallMap->getFirewallConfig($request);

        // Proceed with $firewallConfig information
    }
}

Подробнее о классе FirewallConfig здесь.

person Leon Willens    schedule 11.05.2018
comment
Спасибо за помощь, Леон. Извините, что я был недостаточно ясен, и я трачу ваше время. Это то, что я имел в виду, что я смог просто получить имя провайдера, просто введя RequestStack и FirewallMap. В карте брандмауэра я вызываю $map->getFirewallConfig($request)->getProvider(). Но это возвращает только имя настроенного провайдера. Может быть есть другой сервис для разрешения имени провайдера, но я ничего не могу найти. Типа в ловушке здесь. - person Matías Navarro Carter; 11.05.2018
comment
Можете ли вы уточнить, что именно вам нужно от поставщика пользователей? - person Leon Willens; 12.05.2018
comment
Чтобы загрузить пользователя по имени пользователя. - person Matías Navarro Carter; 12.05.2018