30

我有两个防火墙:

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

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

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

4

1 回答 1

60

也许您可以尝试“上下文”防火墙属性。

假设您有这样的配置(大概是您这样做的):

security:
    // providers etc ...

    firewall:
        main:
            pattern: # ...
            provider: my_users
            http_basic: ~
        api:
            pattern: # ...
            provider: my_users
            http_basic: ~

在这种情况下,用户的会话将在通过“主”防火墙进行身份验证后包含“_security_main”属性,然后当他们尝试访问“api”位置时,将提示他们重新验证,然后将获得“_security_api”会话属性。

为了防止这种重新提示,您可以将“上下文”属性添加到您希望共享相同身份验证的每个防火墙定义中 - 因此:

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

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

Of course this authentication context sharing will work both ways around (whether they auth first with the 'main' or the 'api' firewall) - if you only wanted transience in one direction, things would be more complex.

Hope this helps.

于 2012-02-23T08:59:57.130 回答