2017-10-22 70 views
2

的某些環境中要求SSL通過2.0.0里程碑版本升級我的Spring Boot應用程序時,我注意到從2.0.0.M4開始security.require-ssl和其他安全配置選項消失了。在current docs中我沒有發現任何關於棄用或新方法的提及,因此我挖掘並找到了the GitHub issue where the work originated。我贊同GitHub問題中的目標:如何在使用Spring Boot 2.0.0.M4 +

顯着簡化2.0中的安全配置。

我很高興改變我的模式升級,但我有點卡在如何在特定環境中要求SSL。我知道我可以使用http.requiresChannel().anyRequest().requiresSecure()WebSecurityConfigurerAdapter配置中完成類似的結果,但我不想在我運行我的應用程序的每個環境(例如沒有證書的前期製作環境,本地主機上的本地開發)中啓用此設置。我知道我可以在我的WebSecurityConfigurerAdapter配置中添加一些條件邏輯,但我希望保持我的Spring配置「不受環境影響」,並將我的環境特定配置保存在配置文件特有的屬性文件中。

經過對Spring Boot安全配置的最近簡化更改後,在某些環境中需要SSL的建議方法是什麼?

回答

2

根據您的設置有幾個選項。

更改RequestMatcher

如果您需要HTTPS的唯一時間是在與代理注入的自定義標題的環境(即X-Forwarded- *頭),你可以做這樣的事情:

http 
    .requiresChannel() 
     .requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null).requiresSecure() 
     .and() 
    // ... 

這種方法的好處是你不需要做任何事情來打開或關閉HTTPS。缺點是比較頭文件的性能非常低。這種性能損失應該可以忽略不計,但對某些人來說可能並不美觀。

條件配置

由於這是Java的代碼,你可以總是有決定如果您需要HTTPS或不是一個布爾標誌。例如,創建一個成員變量,並與像這樣解析爲Externalized Configuration

@Value("${security.require_ssl}") 
private boolean requireHttps; 

然後使用這樣的事情:

if(this.requireHttps) { 
    http 
     .requiresChannel() 
      .anyRequest().requiresSecure(); 
} 

http 
    // ... 

這種方法很好地與Spring引導1.x的做法和它對齊不會受到每個請求中附加的if語句的影響。但是,它需要一個財產進行管理。

型材

正如Madhura提到你也可以使用@Profile。如果您在環境之間有很多不同之處,並且對於確定是否需要HTTPS等輕微事情不理想,我發現這種方法更適合。這種方法在進行小改動時遇到的問題是你遇到了很多重複。

2

你完全正確地爲自定義安全配置添加自己的WebSecurityConfigurerAdapter。要保持配置環境不可知,您可以添加@Profile,以便根據活動配置文件打開和關閉它。如果只有與環境無關的ssl配置,並且其餘安全配置對於所有環境都是相同的,則可以添加WebSecurityConfigurerAdapter,該配置只配置http.requiresChannel().anyRequest().requiresSecure(),其上有@Profile,並命令它爲第一個一個踢。

相關問題