Fosuserbundle 在Symfony2中获取安全配置?

Fosuserbundle 在Symfony2中获取安全配置?,fosuserbundle,symfony,Fosuserbundle,Symfony,我想访问security.yml中配置的安全配置(默认情况下),尤其是我需要路由名称或(更好的)生成的URL来登录。当使用FOS用户(我现在正在使用)时,它被称为“FOS用户安全登录”,带有“/login”URL。我需要将它与内核的侦听事件上的事件请求(requsted)URL进行比较 我可以在我的内核侦听器类中硬编码此设置检查,如下所示: public function onKernelResponse(\Symfony\Component\HttpKernel\Event\FilterRes

我想访问security.yml中配置的安全配置(默认情况下),尤其是我需要路由名称或(更好的)生成的URL来登录。当使用FOS用户(我现在正在使用)时,它被称为“FOS用户安全登录”,带有“/login”URL。我需要将它与内核的侦听事件上的事件请求(requsted)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中做到这一点?

如果我是你,我会避免阅读安全设置,因为你可以有多个具有多个登录名的防火墙,因此你的侦听器必须侦听所有这些(这可能不是你想要的)或人为地限制硬编码防火墙。此外,这将把您的实现与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的安全组件。此外,如果要检查多个URL,可以将其设置为一个数组并指定不同的登录URL,例如,当您有多个登录机制时

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

编辑:

在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%
在config.yml中:

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

阅读本文:额外的问题是它没有在security.yml中明确设置。我正在考虑的唯一明智的解决方案是将配置加倍,并在parameters.yml:login\u route:fos\u user\u security\u login中进行一些设置。但这意味着,当我替换登录机制(放弃FOS用户包)时,我还需要记住更改parameters.yml(将此参数设置在那里比直接在listener类中硬编码更好,如上所示)。无论如何,谢谢。是的,我知道你的意思。如果不需要额外的配置参数,那就更好了。但是可以帮助的是在yaml文件.Thx中做一个注释,这是一个有趣的解决方案。你的回答为问题增加了一些东西:对SF安全组件之外的可恢复性的认识。但让我们回到我的问题:它不是将“/login”(或者它的路由名称等价物)硬编码设置移动到另一个地方——DI配置文件中的侦听器配置吗?如果没有,我如何知道SF安全组件使用的$loginUrl的值?您的loginUrl是一个配置。默认情况下,您可以在
防火墙.my\u防火墙.form\u login.login\u路径下的security.yml中设置它(/login是默认值,这就是为什么FOSUserBundle不会在文档的security.yml中显示它的原因)。您可以将其设置为参数,并使用它在侦听器和security.yml中设置值。你可以在你的应用程序的routing.yml中进行覆盖,这样事情应该仍然有效。这不是硬编码,而是配置。你把事情搞得太复杂了:)不太复杂。如果SF配置中有一个名为“firewalls.my_firewall.form_login.login_path”的通用参数,那么我可以使用它,FOS用户可以使用它,应用程序的任何其他捆绑包也可以依赖它。但根据您的建议,我应该硬编码“/login”,或者强制覆盖它(例如使用“/login”)。这真的很不灵活,SF中最简单的方法可能就是简单地创建一个新的参数——由于它,我不必在应用程序中多次使用“/login”字符串。:)事实上,它起作用了。我刚刚在一个新项目中使用symfony 2.7.5对其进行了测试,请参见更新的答案。一个值用于配置多个内容。这与硬编码完全不同;)是的,但这是第二种情况:如果没有公开的此参数,则强制覆盖该参数。:)Thanx无论如何,我对你的答案投了更高的票,因为这是一个解决方案,但并没有完全回答这个问题(在SF中,这似乎不可能以正常的方式实现——这是SF中缺少的另一件事):)
# config for listener in your bundle
my_bundle:
    login_path: %custom_login_path%