我正在制作一个自定义"访问控制",这与某些逻辑而不是角色有关。
如果在数据库中设置了特定选项,则用户可以继续,如果不是,他需要从系统中的任何位置重定向到某个页面,无论方式如何(导航,直接网址等。)。
到目前为止,我已经创建了一个 SecurityListener ,它基本上通过names.directory_path = (TNSNAMES, EZCONNECT)
方法从数据库中提取选项,并将它们存储在Security上下文中,以便我可以访问它们在任何时间,从任何地方。那部分按预期工作。
现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应式监听器并修改onSecurityInteractiveLogin()
方法,但它似乎不起作用。这就是我到目前为止所做的:
onKernelResponse()
在我的 service.xml 文件中,我按如下方式描述了该服务:
namespace MyProj\UserBundle\EventListener;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
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'));
}
它并没有真正做任何事情。我错过了什么,我使用的是正确的方法吗?我愿意接受任何建议,谢谢。
答案 0 :(得分:0)
不确定sf 2.5,但我认为你的活动名称应为" kernel.response"不只是"回应"。
另外我会使用而不是使用kernelRequest而不是Response,因此您将保存一些与确定无关的进程。
答案 1 :(得分:0)
尝试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));
}
}
}
将其添加到您的services.yml:
services:
access_listener:
class: Acme\DemoBundle\Listener\AccessListener
arguments: [ @security.context, @router ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }