我的门户上有一个Sso身份验证,如果请求中存在特定的头,它会绕过登录表单。
当我试图冒充用户时,Symfony的上下文侦听器会找到该用户并将其加载到安全上下文中,然后我的Sso侦听器会检测到标头并覆盖安全令牌中的令牌。因此,阻止失败了。
我有两个想法,但我不知道可行性:
- 有没有办法为这些安全侦听器配置优先级
- 是否有一种方法可以从Firewall\ListenerInterface的handle方法的事件中检测是否已经在安全上下文中设置了经过身份验证的令牌
下面是一个使用getSubscribedEvents设置优先级的监听器示例:
class ModelEventListener extends ContainerAware implements EventSubscriberInterface
{
const ControllerRoleEventListenerPriority = -1100;
const ControllerModelEventListenerPriority = -1900;
const ControllerFormEventListenerPriority = -1910;
const ViewEventListenerPriority = -1900;
public static function getSubscribedEvents()
{
return array(
KernelEvents::CONTROLLER => array(
array('onControllerRole', self::ControllerRoleEventListenerPriority),
array('onControllerModel', self::ControllerModelEventListenerPriority),
array('onControllerForm', self::ControllerFormEventListenerPriority),
),
KernelEvents::VIEW => array(
array('onView', self::ViewEventListenerPriority),
),
);
}
您也可以在services.yml文件中设置优先级:http://symfony.com/doc/current/cookbook/service_container/event_listener.html
services:
kernel.listener.your_listener_name:
class: AppBundleEventListenerAcmeExceptionListener
tags:
-
name: kernel.event_listener
event: kernel.exception
method: onKernelException
priority: 666
最后,以下是一些框架服务的优先事项:http://symfony.com/doc/current/reference/dic_tags.html#kernel-事件侦听器
不确定安全侦听器优先级记录在哪里。他们一定在附近。您可以随时查看安全捆绑包。