2017-10-12 50 views
1

我有非常簡單的Spring Boot應用程序和社交單點登錄功能。彈出OAuth2負載平衡器背後的SSO

它看起來像這樣:

@Configuration 
@EnableOAuth2Sso 
class Application { 
    // beans 
} 

,它已要求application.yml條目:

security: 
    oauth2: 
    client: 
     # clientId: ... 
     # clientSecret: ... 
     accessTokenUri: https://www.googleapis.com/oauth2/v3/token 
     userAuthorizationUri: https://accounts.google.com/o/oauth2/auth 
     tokenName: oauth_token 
     authenticationScheme: query 
     clientAuthenticationScheme: form 
     scope: email 
    resource: 
     userInfoUri: https://www.googleapis.com/userinfo/v2/me 
     preferTokenInfo: false 

它工作得很好我的本地機器上,當只有一個實例啓動。

當多個實例隱藏在負載平衡器後面時,會發生問題。

即使用戶在所述第一請求認證,之後負載平衡器作出請求被阻塞,由於401

的請求被路由到不同的應用程序實例中相比於所述第一個之一。


我想弄清楚,我怎麼能使用JWT或JDBC無國籍做,所以它可以跨多個實例。不幸的是,我沒有在網上找到任何工作示例。

有一些需要啓動授權服務器。但這不是我的情況,因爲我想完全將授權轉發給第三方提供商(例如Google)。

在這種情況下,我應該如何讓授權在多個實例中工作?

回答

1

Spring存儲cookie內部會話的ID,但數據在web服務器(tomcat?)上的某個位置,並且由此ID獲取。當你的請求命中其他tomcat實例時,它只是不能將id連接到數據。你可以做的是看看春季會議項目,它使用redis代替特定的實例文件系統。

其他方式 - 我不推薦,但可能會爲您的解決方案確定 - 是使用LB上的粘性會話。 LB會小心地將用戶請求一遍又一遍地傳遞給同一臺服務器。當然,這是不安全的解決方案,因爲當網絡服務器死亡時,用戶將失去會話/註銷應用程序。

+0

謝謝,最後我用redis的spring會話作爲後端。不幸的是,我也在使用Vaadin,它在這種基礎設施中爲我提供了另一堆問題,但最終我用一些骯髒的黑客攻克了它們。感謝提示! – dmydlarz