我的门户上有一个 Sso 身份验证,如果请求中存在特定标头,它会绕过登录表单。
当我尝试模拟用户时,Symfony 的上下文侦听器会找到用户并将其加载到安全上下文中,然后我的 Sso 侦听器检测标头并覆盖安全令牌中的令牌。所以模仿失败了。
我有两个想法,但我不知道可行性:
- 有没有办法为这些安全监听器配置优先级?
- 有没有办法从 Firewall\ListernerInterface 的句柄方法的事件中检测是否已经在安全上下文中设置了经过身份验证的令牌?
我的门户上有一个 Sso 身份验证,如果请求中存在特定标头,它会绕过登录表单。
当我尝试模拟用户时,Symfony 的上下文侦听器会找到用户并将其加载到安全上下文中,然后我的 Sso 侦听器检测标头并覆盖安全令牌中的令牌。所以模仿失败了。
我有两个想法,但我不知道可行性:
这是一个使用 getSubscriedEvents 设置优先级的监听器示例:
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: AppBundle\EventListener\AcmeExceptionListener
tags:
-
name: kernel.event_listener
event: kernel.exception
method: onKernelException
priority: 666
最后,这里是一些框架服务的优先级:http: //symfony.com/doc/current/reference/dic_tags.html#kernel-event-listener
不确定安全侦听器优先级记录在哪里。他们一定在某个地方。您可以随时查看安全包。