使用 FOSUserBundle 根据用户角色重定向到不同的主页
redirect to a different homepage following user role using FOSUserBundle
在我的 Symfony 应用程序中,我使用的是 FOSUserBundle。
这是一个涉及两个主要用户角色的应用程序:ROLE_FACTORY
的工厂和 ROLE_CUSTOMER
的客户。
我有一个未连接用户的主页,它是应用程序的主页。
但是当用户要连接或连接时,根据他的角色,主页必须改变。
因此 fos 用户登录操作必须重定向到正确的页面。
ROLE_FACTORY
必须重定向到 factory_homepage
路由。
ROLE_CUSTOMER
必须重定向到 customer_homepage
路由。
如何使用 Symfony
和 FOSUSerBundle
.
在 最佳实践 中创建此行为
首先,对此没有最佳实践。因此,我将根据您的需要选择适合您的选项的决定留给您。
选项 1:
在这种情况下,您必须实施 EventListener
。
步骤 1)
注册服务
<service id="acme_demo.listener.login" class="Acme\DemoBundle\EventListener\LoginListener" scope="request">
<tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin"/>
<argument type="service" id="router"/>
<argument type="service" id="security.context"/>
<argument type="service" id="event_dispatcher"/>
</service>
步骤 2)
你的 EventListener
本身
class LoginListener
{
protected $router;
protected $security;
protected $dispatcher;
public function __construct(Router $router, SecurityContext $security, EventDispatcher $dispatcher)
{
$this->router = $router;
$this->security = $security;
$this->dispatcher = $dispatcher;
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$this->dispatcher->addListener(KernelEvents::RESPONSE, array($this, 'onKernelResponse'));
}
public function onKernelResponse(FilterResponseEvent $event)
{
if ($this->security->isGranted('ROLE_FACTORY'))
{
$response = new RedirectResponse($this->router->generate('factory_homepage'));
}
elseif ($this->security->isGranted('ROLE_CUSTOMER'))
{
$response = new RedirectResponse($this->router->generate('customer_homepage'));
}
else
{
$response = new RedirectResponse($this->router->generate('default_homepage'));
}
$event->setResponse($response);
}
}
选项 2:
您可以在 FOSUserBundle\Controller\SecurityController 处修改供应商代码 添加以下代码,使您的 loginAction
看起来像这样
public function loginAction(Request $request)
{
$securityContext = $this->container->get('security.context');
$router = $this->container->get('router');
if ($securityContext->isGranted('ROLE_FACTORY'))
{
return new RedirectResponse($router->generate('factory_homepage'));
}
elseif ($securityContext->isGranted('ROLE_CUSTOMER'))
{
return new RedirectResponse($router->generate('customer_homepage'));
}
else
{
return new RedirectResponse($router->generate('default_homepage'));
}
}
在我的 Symfony 应用程序中,我使用的是 FOSUserBundle。
这是一个涉及两个主要用户角色的应用程序:ROLE_FACTORY
的工厂和 ROLE_CUSTOMER
的客户。
我有一个未连接用户的主页,它是应用程序的主页。
但是当用户要连接或连接时,根据他的角色,主页必须改变。
因此 fos 用户登录操作必须重定向到正确的页面。
ROLE_FACTORY
必须重定向到 factory_homepage
路由。
ROLE_CUSTOMER
必须重定向到 customer_homepage
路由。
如何使用 Symfony
和 FOSUSerBundle
.
首先,对此没有最佳实践。因此,我将根据您的需要选择适合您的选项的决定留给您。
选项 1:
在这种情况下,您必须实施 EventListener
。
步骤 1)
注册服务<service id="acme_demo.listener.login" class="Acme\DemoBundle\EventListener\LoginListener" scope="request">
<tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin"/>
<argument type="service" id="router"/>
<argument type="service" id="security.context"/>
<argument type="service" id="event_dispatcher"/>
</service>
步骤 2)
你的EventListener
本身
class LoginListener
{
protected $router;
protected $security;
protected $dispatcher;
public function __construct(Router $router, SecurityContext $security, EventDispatcher $dispatcher)
{
$this->router = $router;
$this->security = $security;
$this->dispatcher = $dispatcher;
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$this->dispatcher->addListener(KernelEvents::RESPONSE, array($this, 'onKernelResponse'));
}
public function onKernelResponse(FilterResponseEvent $event)
{
if ($this->security->isGranted('ROLE_FACTORY'))
{
$response = new RedirectResponse($this->router->generate('factory_homepage'));
}
elseif ($this->security->isGranted('ROLE_CUSTOMER'))
{
$response = new RedirectResponse($this->router->generate('customer_homepage'));
}
else
{
$response = new RedirectResponse($this->router->generate('default_homepage'));
}
$event->setResponse($response);
}
}
选项 2:
您可以在 FOSUserBundle\Controller\SecurityController 处修改供应商代码 添加以下代码,使您的 loginAction
看起来像这样
public function loginAction(Request $request)
{
$securityContext = $this->container->get('security.context');
$router = $this->container->get('router');
if ($securityContext->isGranted('ROLE_FACTORY'))
{
return new RedirectResponse($router->generate('factory_homepage'));
}
elseif ($securityContext->isGranted('ROLE_CUSTOMER'))
{
return new RedirectResponse($router->generate('customer_homepage'));
}
else
{
return new RedirectResponse($router->generate('default_homepage'));
}
}