Php Symfony 2.5:根据条件从任何页面重定向
我正在开发一个自定义的“访问控制”,它与某些逻辑有关,而不是角色 如果在数据库中设置了特定选项,则用户可以继续,如果没有,则需要从系统中的任何位置重定向到某个页面,而不考虑方式(导航、直接URL等) 到目前为止,我已经创建了一个SecurityListener,它基本上通过Php Symfony 2.5:根据条件从任何页面重定向,php,redirect,response,event-listener,symfony-2.5,Php,Redirect,Response,Event Listener,Symfony 2.5,我正在开发一个自定义的“访问控制”,它与某些逻辑有关,而不是角色 如果在数据库中设置了特定选项,则用户可以继续,如果没有,则需要从系统中的任何位置重定向到某个页面,而不考虑方式(导航、直接URL等) 到目前为止,我已经创建了一个SecurityListener,它基本上通过onSecurityInteractiveLogin()方法从数据库中提取选项,并将它们存储在安全上下文中,这样我就可以随时随地访问它们。那部分工作正常 现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应侦听器并修改on
onSecurityInteractiveLogin()
方法从数据库中提取选项,并将它们存储在安全上下文中,这样我就可以随时随地访问它们。那部分工作正常
现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应侦听器并修改onKernelResponse()
方法,但它似乎不起作用。这就是我到目前为止所做的:
在我的service.xml文件中,我对服务的描述如下:
<service id="response.listener" class="MyProj\UserBundle\EventListener\ResponseListener">
<tag name="kernel.event_listener" event="response" method="onKernelResponse" />
<argument type="service" id="security.context" />
<argument type="service" id="session" />
<argument type="service" id="router" />
</service>
它实际上什么都没做。我是否遗漏了什么,是否使用了正确的方法?我愿意接受任何建议,谢谢。不确定sf 2.5,但我认为您的事件名称应该是“kernel.response”,而不仅仅是“response”
另外,我更愿意使用kernelRequest而不是Response,这样您将保存一些最终不相关的进程。不确定sf 2.5,但我认为您的事件名称应该是“kernel.Response”,而不仅仅是“Response”
另外,我更愿意使用kernelRequest而不是Response,因此您将保存一些最终不相关的进程。尝试使用
AccessListener
如下:
class AccessListener
{
private$security;
private $router;
public function __construct($security, $router)
{
$this->security = $security;
$this->router = $router;
}
public function onKernelRequest(GetResponseEvent $event)
{
if ($this->security->isGranted('PINK_UNICORN')) {
$url = $this->router->generate('pink_unicorn_totorial');
$event->setResponse(new RedirectResponse($url));
}
}
}
将其添加到您的服务中。yml:
services:
access_listener:
class: Acme\DemoBundle\Listener\AccessListener
arguments: [ @security.context, @router ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
尝试以下方式使用
AccessListener
:
class AccessListener
{
private$security;
private $router;
public function __construct($security, $router)
{
$this->security = $security;
$this->router = $router;
}
public function onKernelRequest(GetResponseEvent $event)
{
if ($this->security->isGranted('PINK_UNICORN')) {
$url = $this->router->generate('pink_unicorn_totorial');
$event->setResponse(new RedirectResponse($url));
}
}
}
将其添加到您的服务中。yml:
services:
access_listener:
class: Acme\DemoBundle\Listener\AccessListener
arguments: [ @security.context, @router ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }