在Symfony2中获取安全配置​​?

时间:2015-10-19 15:21:33

标签: fosuserbundle symfony

我想访问security.yml中配置的安全配置(默认情况下),特别是我需要路由名称或(更好)生成的URL到登录。当使用FOS用户(我现在正在使用它)时,其名为“fos_user_security_login”,带有“/ login”URL。我需要它与内核收听的事件中的事件请求(请求)URL进行比较。

我可以在我的内核侦听器类中对此设置进行硬编码,如下所示:

public function onKernelResponse(\Symfony\Component\HttpKernel\Event\FilterResponseEvent $event)
{
    if ($originalResponse->headers->has('location')
        && $originalResponse->headers->get('location') === $router->generate('fos_user_security_login', array(), true))
    {
       //...
    }
}

但是,如果我将来将此设置更改为另一个设置,例如,使用我的自定义登录处理程序到某个“/ user / login”路径?这就是为什么我想阅读登录的安全设置。

我如何在Symfony中执行此操作?

1 个答案:

答案 0 :(得分:2)

如果我是你,我会避免阅读此安全设置,因为您可以拥有多个登录多个防火墙,因此您的收听者必须听取所有这些(可能不是您想要的)或人为限制到硬编码的防火墙。此外,这会将您的实现与Symfony的安全组件联系起来,您应该避免使用它。

一种易于重复使用的方法是,将要检查的URL或路由名称作为参数添加到侦听器,并通过Symfony的服务容器传递,然后只需将请求与该值进行比较:

class LoginListener
{
    /**
     * @var string
     */
    protected $loginUrl;


    /**
     * @param string $loginUrl
     */
    public function __construct($loginUrl)
    {
        // You can even fallback to default if you like:
        if (empty($loginUrl)) {
            $loginUrl = '/login';
        }
        $this->loginUrl = $loginUrl;
    }

    // [...] your comparison just against $this->loginUrl
}

然后,您可以使用捆绑包的配置将正确的参数传递给该侦听器。

通过这种方式,您可以轻松地在Symfony之外重复使用它,例如在Silex,而不是与Symfony的安全组件绑定。此外,如果您想要检查多个网址,您可以将其设为数组并指定不同的登录网址,例如当你有多个登录机制时。

编辑:在您的捆绑包配置中,您可以检查参数并定义回退或错误消息或其他内容(请参阅Getting and Setting Container Parameters)。

编辑:

in parameters.yml:

custom_login_path: /my_login

在security.yml中:

    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
            login_path: %custom_login_path%
在routing.yml中

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

# Make sure this follows "fos_user" so it takes precendece over the default
fos_user_security_login:
    path: %custom_login_path%
    defaults: { _controller: FOSUserBundle:Security:login }

在config.yml中:

# config for listener in your bundle
my_bundle:
    login_path: %custom_login_path%