在我的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);
});
}
});
在最佳做法中创建此行为。
答案 0 :(得分:2)
首先,没有最好的做法。所以我决定根据你的需要为你选择其中一个选项。
在这种情况下,您必须实施EventListener
。
<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>
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);
}
}
您可以在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'));
}
}