使用 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 路由。

如何使用 SymfonyFOSUSerBundle.

最佳实践 中创建此行为

首先,对此没有最佳实践。因此,我将根据您的需要选择适合您的选项的决定留给您。

选项 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'));
    }
}