2013-03-30 3 views
1

Im делает Многоквартирный сервис, где им проверка пользователей против:Как получить поддомен в UserProvider

имени пользователя, пароля, подобласти

Me с помощью FOSUserBundle

Я хотел бы использовать UserProvider, чтобы быть в курсе от wchich домен его вызвал, а затем заставил пользователя найти.

Проблемы я не могу получить доступ к @request любого я попробовать контейнер или набор инъекцию я получил

«ScopeWideningInjectionException: Объем Расширяя Injection обнаружено»

есть ли правильный способ продлить FOSUserBundle быть запрашивать при подтверждении (сделать логин пользователя) имя пользователя?

ответ

0

Finaly Я сделал это так:

использовано SyndMultiTenantBundle для Многоквартирный предложение с domainstrategy

и сделать он работает с FOSUserBundle:

  1. Создания нового UserManager & UserRepository классы
  2. переопределять UserManager: метод loadUserByUsername для запроса к хранилищу непосредственно
  3. Компилятору передать использовать пользовательский менеджер использования (изменить
    класса определения)
  4. Добавить слушатель на арендатора.Получить
    $ userManager-> setTenant ($ event-> getTenant()) передать арендатору в
    объем хранилища

Благодаря Adrian из SyndicateTheory

Он работает как шарм - Наслаждайтесь!

0

Вы пробовали «Изменение области UserProvider? http://symfony.com/doc/current/cookbook/service_container/scopes.html

my_user_provider: 
    class: Acme\HelloBundle\UserProvider 
    scope: request 
    arguments: [@request] 

Не уверен, что если он будет работать в этом случае. Материал безопасности это хитрый.

Альтернатива может быть создание ЗАЯВКИ слушатель, попробуем вытащить субдомен, а затем попросите его ввести его в провайдер.

+0

Это точно задает вопрос, который я поставил под вопрос: «ScopeWideningInjectionException: Scope Widening Injection detected» – nicoonee

+0

Затем перейдите к прослушивателю запроса. – Cerad

0

У меня была такая же проблема с Symfony 2.1. Я смог предоставить параметр @service_container как параметр непосредственно у моего провайдера, а затем получить запрос ..

С тех пор как я обновился до SF 2.2, больше не работает!

Даже если вы установили «scope: active» или «public: true» в своей конфигурации.

Если вы попытаетесь получить запрос промежуточным слушателем, это тоже не сработает ... Кажется, начиная с SF2.2 запрос не вводится вовремя или что-то в этом роде.

Так вот, как я могу получить запрос внутри провайдера, я не знаю, если он чист, но это единственное решение, которое я нашел, я приклеил 2 решения, для SF 2.2 и SF 2.1:

SF класса 2,2

Поставщик:

use Symfony\Component\HttpFoundation\Request; 

// ... 

class WebsiteUserProvider implements UserProviderInterface 
{ 
    private $websiteUrl; 

    // ... 

    public function __construct(UserManager $userManager) 
    { 
     $this->userManager = $userManager; 

     // Works for sf2.2, init manually the request 
     $request = Request::createFromGlobals(); 
     $this->websiteUrl = $request->getHost(); 
    } 

    // ... 
} 

Вот оно!


SF 2.1

класс Поставщик:

// ... 

class WebsiteUserProvider implements UserProviderInterface 
{ 
    private $websiteUrl; 

    // ... 

    public function __construct($container, UserManager $userManager) 
    { 
     $this->userManager = $userManager; 

     if ($container->isScopeActive('request')) { 
      $this->websiteUrl = $container->get('request')->getHost(); 
     } 
    } 

    // ... 
} 

Конфигурация:

sybio_website.user_provider: 
    class: Sybio\Bundle\WebsiteBundle\Security\Authentication\Provider\WebsiteUserProvider 
    arguments: [@service_container, @sybio.user_manager] 
+0

Это было бы хорошо, если бы кто-нибудь мог сказать, что изменилось 2.1 -> 2.2 он доцент больше работает – nicoonee

+0

Если вы используете прослушиватель запросов, запрос будет частью события. Не нужно вводить его. – Cerad

+0

@ nicoonee вы попробовали мое решение для SF 2.2? Он работает над моим проектом. – Sybio