2012-01-31 64 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