1

我正在做多租户服务,我在其中验证用户:

用户名、密码、子域

我使用 FOSUserBundle

我想使用 UserProvider 从它调用的 wchich 域中了解它,然后让用户找到。

问题是我无法访问@request 无论我尝试容器或设置我得到的注入

“ScopeWideningInjectionException:检测到范围扩大注入”

是否有任何适当的方法可以扩展 FOSUserBundle 以在验证(使用户登录)用户名时了解请求?

4

3 回答 3

0

您是否尝试过“更改 UserProvider 的范围?http ://symfony.com/doc/current/cookbook/service_container/scopes.html

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

不确定它在这种情况下是否有效。安全的东西很棘手。

另一种方法可能是创建一个 REQUEST 侦听器,让它拉取子域,然后将其注入用户提供程序。

于 2013-03-31T13:46:53.383 回答
0

我遇到了同样的问题,使用 Symfony 2.1 我可以直接在我的提供程序中将 @service_container 作为参数提供,然后获取请求......

自从我更新到 SF 2.2,不再工作了!

即使您在配置中设置了“范围:活动”或“公共:真”。

如果您尝试通过中间侦听器获取请求,它也不起作用......从 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]
于 2013-04-01T08:41:37.257 回答
0

Finaly I did it this way:

Used SyndMultiTenantBundle for multitenant propose with domainstrategy

and to make it work with FOSUserBundle:

  1. Create new UserManager & UserRepository classes
  2. Override your UserManager:loadUserByUsername method to query your repository directly
  3. Compiler pass to use your custom use manager (change
    class of definition)
  4. Add a listener on tenant.found to call
    $userManager->setTenant($event->getTenant()) to pass tenant into
    scope of repository

Thanks to Adrian from SyndicateTheory

It works like a charm - Enjoy!

于 2013-04-02T22:00:28.783 回答