Symfony2:如何将身份验证侦听器配置值获取到另一个服务中?

Symfony2:如何将身份验证侦听器配置值获取到另一个服务中?,symfony,single-sign-on,cas,Symfony,Single Sign On,Cas,我正在为Symfony 2创建一个身份验证提供程序,允许用户使用名为的单点登录协议进行身份验证 我的身份验证侦听器扩展自。其中一个配置参数是check_path,它是触发身份验证侦听器对请求进行身份验证的路径/路由 当我构造CAS服务器的URL时,我需要检查路径(这样CAS服务器就知道用户返回到哪里),这很容易,因为我的自定义入口点类在我的安全工厂中构造时会传递配置数组 困难的部分是,我还需要在监听器外部执行检查路径,就像在我的身份验证提供程序类中进行身份验证时一样。我需要它,因为当CAS服务器

我正在为Symfony 2创建一个身份验证提供程序,允许用户使用名为的单点登录协议进行身份验证

我的身份验证侦听器扩展自。其中一个配置参数是
check_path
,它是触发身份验证侦听器对请求进行身份验证的路径/路由

当我构造CAS服务器的URL时,我需要
检查路径
(这样CAS服务器就知道用户返回到哪里),这很容易,因为我的自定义入口点类在我的安全工厂中构造时会传递配置数组

困难的部分是,我还需要在监听器外部执行
检查路径
,就像在我的身份验证提供程序类中进行身份验证时一样。我需要它,因为当CAS服务器将用户发送回应用程序时,它会传递一个必须验证的“ticket”参数。为了验证它,我向CAS服务器发送了一个curl请求,该请求必须包含票证以及使用的原始
check\u路径

在写这篇文章时,我意识到当我在身份验证提供程序中时,我可以获取页面请求的当前URL(因为触发它的是
check\u path
),但这似乎是错的,我更愿意直接获取配置值来重新构建服务URL。当我想在其他地方使用
check\u path
时,它也帮不了我,比如在构建CAS服务器的注销URL时,同样需要
check\u path


EDIT:
AbstractFactory
createAuthProvider
方法同时传递给配置和容器,但我无法修改此处的任何服务,因为它们还不是容器的一部分。如果我有办法在我的服务加载后添加一个编译器过程,并以某种方式访问侦听器配置?

您能将check\u path作为参数传递给您的侦听器吗

如果它是在配置文件或参数文件中定义的,则可以将其传递给侦听器,如下所示:

your_authentication_listener:
    class: YourBundle\Listener\AuthenticationListener
    arguments: ['%check_path%']
    tags:
        ...
public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\YamlFileLoader(
        $container,
        new FileLocator(__DIR__.'/../Resources/config')
    );
    $loader->load('services.yml');
}
your_bundle_name:
    check_path: foo

(如果我理解您的意思是正确的。)

您可以将
%check_path%
(或其命名空间版本)设置为“正常”参数: 在
DependencyInjection
内部,有两个类(默认情况下)负责定义和加载捆绑包的配置。在这里,您还可以将配置注入到服务容器中

  • DependencyInjection\Configuration
    是定义包中哪些配置可用、它们应该是什么类型等的地方

  • DependencyInjection\YourBundleNameExtension
    是您可以加载配置并将其添加到服务容器的地方

如果您尚未在其中执行任何操作,则扩展的
load()
-方法应如下所示:

your_authentication_listener:
    class: YourBundle\Listener\AuthenticationListener
    arguments: ['%check_path%']
    tags:
        ...
public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\YamlFileLoader(
        $container,
        new FileLocator(__DIR__.'/../Resources/config')
    );
    $loader->load('services.yml');
}
your_bundle_name:
    check_path: foo
$config
以数组的形式保存捆绑包的配置,因此如果我们设想您的YAML配置文件如下所示:

your_authentication_listener:
    class: YourBundle\Listener\AuthenticationListener
    arguments: ['%check_path%']
    tags:
        ...
public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\YamlFileLoader(
        $container,
        new FileLocator(__DIR__.'/../Resources/config')
    );
    $loader->load('services.yml');
}
your_bundle_name:
    check_path: foo
您的
$config
将如下所示:

array( 'check_path' => 'foo' )
现在,您所要做的就是将此配置添加到容器中。在
load()
-方法中,只需添加如下内容:

$container->setParameter(
    'my_bundle_name.check_path',
    $config['check_path']
);
在您的
服务.yml
中,您现在可以使用
%my\u bundle\u name。像其他参数一样,检查\u path%

my_bundle_name.security.authentication.provider:
    class: MyBundleName\Security\Core\Authentication\Provider\MyAuthenticationProvider
    arguments: ['%my_bundle_name.check_path%']
有关更多详细信息,请参阅Symfony的文档[,
]

检查路径
不是正常参数,因此无法执行此操作。它是身份验证侦听器的一个配置选项(请参见类的代码
AbstractAuthenticationListener
)。谢谢。我知道我确实可以将
check\u path
设置为一个正常的配置参数,但我宁愿不设置,因为我必须指示捆绑包的用户在捆绑包配置和身份验证提供程序配置中指示
check\u path
。我不完全确定我是否理解您的问题?
check_path
将在bundle配置中设置,然后传递给需要它的任何服务?
check_path
是一个特殊的配置选项,它在您的
security.yml
文件中为身份验证提供程序配置。基本上,我必须通过
security.yml
文件传递它,因此也不希望为我的bundles配置设置它。