我正在做多租户服务,我在其中验证用户:
用户名、密码、子域
我使用 FOSUserBundle
我想使用 UserProvider 从它调用的 wchich 域中了解它,然后让用户找到。
问题是我无法访问@request 无论我尝试容器或设置我得到的注入
“ScopeWideningInjectionException:检测到范围扩大注入”
是否有任何适当的方法可以扩展 FOSUserBundle 以在验证(使用户登录)用户名时了解请求?
我正在做多租户服务,我在其中验证用户:
用户名、密码、子域
我使用 FOSUserBundle
我想使用 UserProvider 从它调用的 wchich 域中了解它,然后让用户找到。
问题是我无法访问@request 无论我尝试容器或设置我得到的注入
“ScopeWideningInjectionException:检测到范围扩大注入”
是否有任何适当的方法可以扩展 FOSUserBundle 以在验证(使用户登录)用户名时了解请求?
您是否尝试过“更改 UserProvider 的范围?http ://symfony.com/doc/current/cookbook/service_container/scopes.html
my_user_provider:
class: Acme\HelloBundle\UserProvider
scope: request
arguments: [@request]
不确定它在这种情况下是否有效。安全的东西很棘手。
另一种方法可能是创建一个 REQUEST 侦听器,让它拉取子域,然后将其注入用户提供程序。
我遇到了同样的问题,使用 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]
Finaly I did it this way:
Used SyndMultiTenantBundle for multitenant propose with domainstrategy
and to make it work with FOSUserBundle:
Thanks to Adrian from SyndicateTheory
It works like a charm - Enjoy!