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

时间:2016-01-08 16:56:58

标签: php symfony redirect fosuserbundle url-redirection

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

这是一个应用程序涉及用户的两个主要角色:工厂为ROLE_CUSTOMER,自定义为ROLE_FACTORY

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

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

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

factory_homepage必须重定向到ROLE_CUSTOMER路线。 customer_homepage必须重定向到Symfony路线。

如何使用FOSUSerBundle$.ajax({ type: "GET", url: "menu5.xml", dataType: "xml", success: function (xml2) { var xml = xml2, /*xmlDoc = $.parseXML(xml),*/ $xml = $(xml); alert($xml.find('sheet').length); $xml.find('sheet').each(function () { alert("here2"); var sheet = $(this); var menuName = $(sheet).attr("name"); alert(menuName); }); } }); 最佳做法中创建此行为。

1 个答案:

答案 0 :(得分: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:

您可以在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'));
    }
}