【问题标题】:How to protect APIs under two different firewalls on Symfony2如何在 Symfony2 上的两个不同防火墙下保护 API
【发布时间】:2013-02-06 03:21:59
【问题描述】:

我目前正在 Symfony2.1 上开发一组新的 Restfull API,它们目前在我的 security.yml 中没有防火墙

    api:
        pattern: ^/api
        security: false

我有一个RequestListener,它通过检查用户是否提供了身份验证令牌或使用基本身份验证来“保护”他们。正确登录后,我们使用用户填充安全上下文。 (也许我们甚至可以使用 Factory 来制作防火墙?)

这非常适合希望在其应用中使用我们的 API 的外部开发人员/组织。

现在,我希望我们在项目中依赖这些相同的 API(控制器、ajax 调用..),我现在想知道我们是否必须自己实现 API get-token 或 Basic Auth 流程来填充API 的安全上下文,或者他们是否可以以某种方式神奇地检索主防火墙的当前安全上下文。 (它可以让我免去获取令牌、将其保存在某处并在我的视图中一直通过我的 Backbonejs ajax 调用传递它的尴尬)。

感谢您对此的看法! :)

【问题讨论】:

    标签: security api rest symfony-2.1


    【解决方案1】:

    首先,对于基本身份验证,您可以依赖 Symfony2 提供的 http_basic authentication provider。无需使用请求侦听器。如果你想使用基于令牌的身份验证,请写a Token authentication provider

    安全上下文是分开的,您不能与另一个上下文交互。它们是完全分区的。但是,您可以根据需要添加任意数量的身份验证提供程序。

    使用 Backbone.js,您可以保持基于令牌的策略。例如,使用 HTML 属性将令牌传递给 Backbone:

    <body data-token="xxxx">
        ...
    </body>
    

    然后,只需在您的 JavaScript 应用程序中使用它:

    $.ajaxSetup({
        headers: {
            'token': $('body').data('token')
        }
    });
    

    请参阅$.ajaxSetup doc 了解更多信息。

    【讨论】:

    • 感谢 http_basic,我忽略了这一点,并为我的 API 重新实现了基本身份验证。关于令牌身份验证提供程序,这只是一个伪装的监听器,不是吗?我昨天想了一些关于我的问题的事情:我不能为每个 API 操作定义两条路由,一条在带有其令牌的 API 防火墙下,第二条在我的主 Sf2 防火墙下。对此有何风险、优势和想法?
    • 复制配置有时会导致问题。为您的主应用程序设置一个“超级”令牌可能是最安全的解决方案。
    • 身份验证提供程序是安全层的一部分,而侦听器不是。
    • 所以,您建议让我的用户在 Controllers / 视图中的主防火墙下登录一次,并在我的 Backbone 应用程序调用我的 API 时登录两次,即使他们可能受益于同一个防火墙?
    • 好的,知道了。因此,您可以通过 Backbone 应用程序(例如使用表单)对用户进行身份验证,然后通过 HTML 将令牌传递给 Backbone 应用程序。然后使用我答案的第二部分在每个请求上发送令牌。您必须编写一个请求侦听器来验证此令牌。令牌是使用“form.csrf_provider”服务生成的(参见 CsrfProviderInterface)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多