我正在为Symfony 2创建一个身份验证提供程序,允许用户使用名为CAS的单点登录协议进行身份验证。
我的身份验证侦听器从AbstractAuthenticationListener延伸。其中一个配置参数是check_path
,它是触发身份验证侦听器对请求进行身份验证的路径/路由。
当我构建CAS服务器的URL时,我需要check_path
(因此CAS服务器知道将用户返回的位置),这很容易,因为我的自定义入口点类是在我的安全性工厂中构建配置数组时传递了配置数组。
困难的部分是我在侦听器之外还需要check_path
,就像在身份验证提供程序类中进行身份验证时一样。我需要它,因为当CAS服务器将用户发送回应用程序时,它会传递必须经过验证的“票证”参数。为了验证它,我向CAS服务器发送一个curl请求,该服务器必须包含故障单以及使用的原始check_path
。
正如写的那样,我意识到当我进入身份验证提供程序时,我可以获取页面请求的当前URL(因为它check_path
无论如何都会触发它),但这似乎是关闭的,而我我宁愿直接获取配置值来重新构建服务URL。当我想在其他地方使用check_path
时,它也没有帮助,比如在构建CAS服务器的注销URL时也需要check_path
。
编辑: createAuthProvider
的{{1}}方法同时传递了配置和容器,但我不能在这里修改任何服务,因为它们还不是容器。也许如果我在加载服务后以某种方式添加编译器传递并以某种方式访问侦听器配置?
答案 0 :(得分:0)
你可以将check_path作为参数传递给你的听众吗?
如果在配置或参数文件中定义了它,你可以将它传递给你的监听器:
your_authentication_listener:
class: YourBundle\Listener\AuthenticationListener
arguments: ['%check_path%']
tags:
...
(如果我理解你是对的。)
答案 1 :(得分:0)
您可以将%check_path%
(或其命名空间版本)设为正常的'参数:
在DependencyInjection
内部,(默认情况下)有两个类负责定义和加载bundle的配置。在那里,您还可以将配置注入服务容器中。
DependencyInjection\Configuration
用于定义捆绑包中可用的配置,应该是哪种类型等。
DependencyInjection\YourBundleNameExtension
是您可以加载配置并将其添加到服务容器的地方。
如果您尚未执行任何操作,则您的扩展程序load()
- 方法应如下所示:
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');
}
$config
以数组的形式保存您的软件包配置,因此,如果我们想象您的YAML配置文件如下所示:
your_bundle_name:
check_path: foo
您的$config
将会是这样的:
array( 'check_path' => 'foo' )
现在,您所要做的就是将此配置添加到容器中。在load()
- 方法中,只需添加以下内容:
$container->setParameter(
'my_bundle_name.check_path',
$config['check_path']
);
在services.yml
内,您现在可以像其他所有参数一样使用%my_bundle_name.check_path%
:
my_bundle_name.security.authentication.provider:
class: MyBundleName\Security\Core\Authentication\Provider\MyAuthenticationProvider
arguments: ['%my_bundle_name.check_path%']