【问题标题】:Symfony2 - Purpose of `anonymous.key` in security.ymlSymfony2 - security.yml 中“anonymous.key”的用途
【发布时间】:2015-09-15 08:29:53
【问题描述】:

我之前设置了一个 Symfony2 应用程序,其中包括匿名路由和受 HTTP BasicAuth 限制的路由。使用默认值的基本防火墙配置如下所示:

firewalls:
    main:
        anonymous: ~
        http_basic: ~

我找不到关于 anonymous 属性选项的信息,除了 Symfony2 的 SecurityBundle 配置的文档,它提供了一个 full default configuration

anonymous 属性似乎只有一个属性:key,如默认配置的 206 行所示:

some_firewall_listener:
    # ...
    anonymous:
        key: 4f954a0667e01

我深入研究了核心代码库和随附的单元测试,它似乎是 AnonymousToken 和/或 AnonymousAuthenticationListener 的构造函数值,但到目前为止我还没有从中学到很多东西。

remember_me 下还有一个 key 属性,但我认为这有不同的目的。

我找不到任何其他信息来描述这个特定的key 属性是什么,以及它的用途是什么。 AnonymousToken::__construct() 需要 $key$user 参数,所以我假设这个选项只是对 Symfony2 自己创建的值的手动覆盖。

有人可以建议吗?谢谢:)

【问题讨论】:

    标签: php security symfony


    【解决方案1】:

    在验证AnonymousToken 时,它们会比较AnonymousAuthenticationProvider 的密钥和令牌。当它们不匹配时,身份验证失败。

    这同样适用于RememberMeTokenRememberMeAuthenticationProvider。当 token 的 key 和 provider 不匹配时,认证失败。

    该密钥用于确定当前进行身份验证的令牌是由应用程序自己创建的,而不是由恶意客户端提交的。这主要是因为 Symfony Security 基于 Spring Security (Java) 并且 Java 具有 RMI (Remote Method Invocation) 支持。来自Spring docs

    在此不应将使用密钥属性视为提供任何真正的安全性。这只是一个簿记练习。如果您正在共享一个包含 AnonymousAuthenticationProvider 的 ProviderManager,其中身份验证客户端可能构造 Authentication 对象(例如使用 RMI 调用),那么恶意客户端可以提交它自己创建的 AnonymousAuthenticationToken(选择用户名和权限列表)。如果密钥是可猜测的或可以找到的,则匿名提供者将接受令牌。这不是正常使用的问题,但如果您使用 RMI,您最好使用自定义的 ProviderManager,它会省略匿名提供程序,而不是共享您用于 HTTP 身份验证机制的提供程序。

    【讨论】:

    • 嗯,这肯定会清除它!我最终通过手动设置密钥和var_dumping security.token_storage 来确认我的断言。这回答了“什么”,您的问题全面回答了“为什么”:) 由于 PHP 不执行 RMI,我认为它主要是多余的 - 或者是否有可能恶意创建令牌?
    • @Darragh 据我了解,这也适用于 ORB(这在 PHP 中是可能的)。
    • 有趣。我不熟悉 ORB - 你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多