2012-01-31 39 views
28

身份验证多个Symfony2的防火墙,我有两个防火墙:一个登录表单

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

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

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

回答

59

也许你可以尝试'上下文'防火墙属性。

假设你有一个配置是这样的(这大概是你做的):

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'中的任何后续请求都将使用'_security_primary_auth'的值来建立身份验证状态(并且用户将显示已验证身份)。

当然,这种身份验证上下文共享可以双向使用(无论他们是首先使用'main'还是'api'防火墙) - 如果您只想在一个方向上实现瞬态过程,事情会变得更加复杂。

希望这会有所帮助。

+1

辉煌!奇迹般有效。 – anushr 2012-02-23 10:45:39

+1

不错,我一直在寻找这个很长一段时间! – PMoubed 2012-06-22 23:29:34

+1

我有完全相同的问题,唯一的区别是“主”防火墙使用登录形式而不是http_basic进行身份验证,因此,即使用户通过登录形式进行身份验证,'api'防火墙也会提示用户再次登录。有什么办法可以使它工作吗? – Xocoatzin 2012-08-03 18:27:35