【问题标题】:Symfony2 How to authenticate an user on two different firewall with two different method?Symfony2 如何使用两种不同的方法在两个不同的防火墙上对用户进行身份验证?
【发布时间】:2025-12-12 03:10:02
【问题描述】:

我有两个防火墙,一个用于我的 API 调用(受 WSSE 保护),一个用于我的应用程序。两者都运行良好,但我需要在 api 防火墙和应用程序防火墙上同时对用户进行身份验证,我不能这样做。

我的 security.yml

firewalls:
    # Firewall for the api
    wsse_secured:
        pattern:   ^/api/.*
        wsse:
            nonce_dir: null
            lifetime: 300
            provider: fos_userbundle
        context: user

    # Firewall for the application
    main:
      pattern: /.*
      form_login:
            provider: fos_userbundle
            login_path:     fos_user_security_login
            check_path:     fos_user_security_check
            default_target_path: espace_perso
            always_use_default_target_path: false
            failure_path: fos_user_security_login
        logout:
            path: fos_user_security_logout
            target: fos_user_security_login
        oauth:
            resource_owners:
                facebook: "/login/check-facebook"
                linkedin: "/login/check-linkedin"
                google: "/login/check-google"
            login_path: fos_user_security_login
            oauth_user_provider:
                service: bg.oauth.user_provider
        anonymous: true
        context: user

我已经阅读了其他帖子(this questionthis onethis one),如您所见,添加上下文不适用于我的情况。

我尝试手动添加我需要的 wsse 标头,或者使用事件为我的用户创建一个新的 WsseToken,但没有成功。

我真的需要帮助解决这个问题,这一定很常见......

【问题讨论】:

  • Wsse 通过 HTTP 标头和 form_login 通过 cookie 进行管理。您是如何尝试访问您的 API 的?
  • 如您所说,我通过 HTTP 标头访问我的 API。例如,我的“主”防火墙后面有一个表单,但这个表单的操作在我的“wsse_secured”防火墙后面。因此,当我单击“验证”时,“wsse_secured”防火墙会向我发送 403,因为我没有在此防火墙上进行身份验证。

标签: api symfony


【解决方案1】:

据我了解,您希望重用 API 中的操作以供用户访问。如果没有,请提供更多详细信息。

最好的办法是为同一操作创建另一条路由,就在不同的防火墙下。

假设你有:

<route id="api_form_validate" pattern="/api/validate-form">
    <default key="_controller">Bundle:ApiController:validateForm</default>
</route>

添加:

<route id="user_form_validate" pattern="/user/validate-form">
    <default key="_controller">Bundle:ApiController:validateForm</default>
</route>

并将表单操作从api_form_validate 更改为user_form_validate

【讨论】:

  • 是的,我有一个解决方案,但我不想有多个重复路线。我更改了身份验证方法,所以现在很好。谢谢你的回答:)
最近更新 更多