2016-07-07 119 views
7

我想設置一個基於spring-boot,spring-security和spring-oauth2的簡單OAuth2提供程序。無狀態彈簧安全oauth2提供程序

我在單個實例機器上得到了一切:對於OAuth2授權,用戶發送到/oauth/authorize。大多數用戶沒有登錄,所以他們被彈簧安全重定向到/login,然後返回/oauth/authorize完成授權。

在默認配置中,spring-security在用戶的瀏覽器中使用session-id設置cookie並將會話數據存儲在內存中。

public static class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
      .and() 
      .formLogin() 
      .loginPage("/login") 
      .permitAll(); 
    } 
[...] 

爲了實現負載均衡和藍綠色的部署沒有鬆動的用戶會話,(我認爲)我必須執行以下步驟:

  • 禁用服務器端會話 - 一個API這隻負責OAuth2授權我不認爲有必要爲會話共享數據庫。
  • 取而代之,請在授權期間啓用包含用戶身份驗證的remember-me Cookie,temporaryriliy。
  • Store中/login重定向URL重定向在不同的地方
    • 是否有可能其存儲在登錄表單或用戶的cookie?或者什麼是「無時間」選擇?
  • 禁用CSRF(我知道如何做到這一點,具有的oauth2我認爲有一個類似的目的auth_codes。只是爲了保持完整性。)

請問這種做法合理嗎?有什麼變化是必要的?

+0

我粗略地做的是:(a)禁用CSRF(b)在cookie中存儲重定向URL。 我只需要存儲oauth2代碼。 – Jan

回答

0
  1. 用戶進行登錄到您的供應商後,生成授權碼是發送給客戶端應用程序(通過重定向(回調)URL)。

  2. 稍後,客戶端應用程序向您的服務器發出請求以獲取訪問令牌。在這個請求中它提供了自動化代碼。

  3. 此時您需要能夠比較客戶端應用程序發送的授權碼與您在第一個位置生成的授權碼。這是你需要共享內存的地方。

如果你看看section-4.1你需要點C和D之間的共享存儲器協議的這部分

這不能與你的服務器之外的任何內容來實現,因爲這是這種地步您確認客戶端應用程序已獲得授權。

類似的情況是在後面的過程中訪問和刷新令牌。

對於登錄步驟(點A和B) - 在登錄表單中使用重定向URL(和客戶端狀態 - 請參見部分4.1)看起來很好。如果這是會話使用的唯一地方 - 您可以擺脫它。但是您仍然需要共享內存(共享數據庫)才能獲得授權碼。

+0

嗨亞歷克斯,你給了OAuth2流的描述,但沒有回答我的問題。對不起,我不能給你這種賞金。 – Jan

+0

是的,不知道你應該在春季安全環境中做什麼的細節,但我的觀點是,無論如何你都需要共享數據庫。 –

+0

好吧,有道理,我實際上將授權代碼存儲在共享數據庫中,以便存在該部分。但我想看看我是否可以擺脫一般會議商店。 – Jan

0

這是分佈式會話存儲的一個經典問題。 首先,「會話」(會話ID和Cookie)與「無狀態」相結合的概念是一種矛盾。

的OAuth2被認爲是一個「無國籍」委託授權框架提供你堅持初始輸入請求(包括重定向URL)生成所述訪問碼之前在服務器側。

在接收憑證之前將這些細節泄露給cookie可能會使您暴露於安全漏洞攻擊。您可以通過確保該cookie爲HttpOnly(不可由JS訪問)和安全(僅通過httpS發佈)緩解風險,但我不會推薦這種方法。

關於您的其他問題:Spring Security的記事本功能旨在僅引用身份驗證憑證,而不是初始auth2請求的詳細信息。而且,持久選項(PersistentTokenBasedRememberMeServices)默認僅支持內存(單節點)和jdbc風格。

根據您的需要調整這些需要進行相當大的更改。可行但需要付出很大的努力。

在我的經驗中,有想到的兩個備選方案:使用前負載平衡器

  1. 配置粘性會話(例如:HAProxy的,nginx的,F5,等...)。用戶會話將綁定到提交的憑據所在的節點。 含義是,如果該節點關閉;用戶將不得不重新進行身份驗證以創建新的訪問令牌,但如果針對其他節點使用訪問令牌,則應該沒有問題。

  2. 配置/實現透明的分佈式Web會話存儲。 某些分佈式內存存儲提供商(例如:hazelcast)提供plugins,它們被配置到應用程序服務器以使其對用戶透明。這意味着額外的開銷,但幾乎沒有額外的代碼需要滿足您的要求。