使用一个登录表单验证多个symfony2防火墙

anu*_*shr 30 firewall symfony symfony-security

我有两个防火墙:

  1. api (用于API调用)
  2. main (其他一切)

我的客户端应用程序登录通过main防火墙进行 但是,它确实与api防火墙下的端点交互以获取数据.这里的问题是我不想强迫用户第二次登录以对第二个防火墙进行身份验证.

如何只使用一个登录表单对两个防火墙进行身份验证?

jst*_*son 60

也许您可以尝试"上下文"防火墙属性.

假设您有类似这样的配置(可能是您这样做):

security:
    // providers etc ...

    firewall:
        main:
            pattern: # ...
            provider: my_users
            http_basic: ~
        api:
            pattern: # ...
            provider: my_users
            http_basic: ~
Run Code Online (Sandbox Code Playgroud)

在这种情况下,用户的会议将验证对"主"防火墙后含有"_security_main"属性,然后当他们尝试访问,他们将被提示重新授权的"API"的位置,然后将获得一个"_security_api"会话属性.

要防止此重新提示,您可以将"context"属性添加到您希望共享相同身份验证的每个防火墙定义中 - 因此:

security:
    # providers etc ...

    firewall:
        main:
            pattern: # ...
            provider: my_users
            http_basic: ~
            context: primary_auth  # new
        api:
            pattern: # ...
            provider: my_users
            http_basic: ~
            context: primary_auth  # new
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在使用"主"防火墙进行身份验证后,将在用户的会话中设置"_security_primary_auth"属性.然后,'api'firewill中的任何后续请求将使用'_security_primary_auth'的值来建立身份验证状态(因此用户将显示已验证身份).

当然,这种身份验证上下文共享可以双向运行(无论是首先使用'main'还是'api'防火墙) - 如果你只想在一个方向上进行短暂处理,事情会更复杂.

希望这可以帮助.