我正在开发一个自定义的"访问控制",它与某些逻辑有关,而不是与角色有关。
如果在数据库中设置了特定的选项,用户可以继续,如果没有,则需要从系统中的任何位置重定向到某个页面,而不考虑方式(导航、直接URL等)
到目前为止,我已经创建了一个SecurityListener,它基本上通过onSecurityInteractiveLogin()
方法从数据库中提取选项,并将它们存储在Security上下文中,这样我就可以随时随地访问它们。那部分工作正常。
现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应侦听器并修改onKernelResponse()
方法,但它似乎不起作用。这就是我目前所拥有的:
namespace MyProjUserBundleEventListener;
use SymfonyComponentSecurityCoreSecurityContextInterface;
use SymfonyComponentSecurityCoreSecurityContext;
use SymfonyComponentHttpFoundationSessionSession;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentRoutingRouterInterface;
class ResponseListener
{
public function __construct(SecurityContextInterface $security, Session $session, RouterInterface $router)
{
$this->security = $security;
$this->session = $session;
$this->router = $router;
}
public function onKernelResponse(FilterResponseEvent $event)
{
//$response = $event->getResponse();
//$event->setResponse($response);
return new RedirectResponse($this->router->generate('intro_page'));
}
在我的service.xml文件中,我对服务的描述如下:
<service id="response.listener" class="MyProjUserBundleEventListenerResponseListener">
<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>
它真的没有任何作用。我是否遗漏了什么?我是否使用了正确的方法?我愿意接受任何建议,谢谢。
不确定sf2.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: AcmeDemoBundleListenerAccessListener
arguments: [ @security.context, @router ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }