首页 文章

使用FOSUserBundle重定向到用户角色后的其他主页

提问于
浏览
0

在我的Symfony应用程序中,我使用的是FOSUserBundle .

这是一个应用程序涉及用户的两个主要角色:Factory为 ROLE_FACTORY ,Custommer为 ROLE_CUSTOMER .

我有一个非连接用户的主页面,它是应用程序的主页 .

但是当用户要连接或连接时,按照他所拥有的角色,主页必须改变 .

因此,fos用户登录操作必须重定向到正确的页面 .

ROLE_FACTORY 必须重定向到 factory_homepage 路线 . ROLE_CUSTOMER 必须重定向到 customer_homepage 路线 .

如何使用 SymfonyFOSUSerBundlebest practice 中创建此行为 .

1 回答

  • 2

    首先,没有最好的做法 . 所以我决定根据您的需要选择其中一个选项给您 .

    选项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:

    您可以在_2385467修改供应商代码 . 添加以下代码以使 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'));
        }
    }
    

相关问题