前言
- 此文也是自己在編程上遇到問(wèn)題的一些記錄,希望能給大家?guī)?lái)一些幫助??
問(wèn)題
Spring Boot 啟用 Spring Security 以后發(fā)現(xiàn) H2 Database 的控制臺(tái)登陸頁(yè)面是無(wú)法訪問(wèn)的。
情況 1 :
能進(jìn)去控制臺(tái)的登陸頁(yè)面(輸入數(shù)據(jù)庫(kù)用戶名和密碼的頁(yè)面),但是登陸以后出現(xiàn)白標(biāo)簽頁(yè)錯(cuò)誤( White Label Error ) ,返回碼是 403 。

情況 2 :
能進(jìn)去控制臺(tái)的登陸頁(yè)面(輸入數(shù)據(jù)庫(kù)用戶名和密碼的頁(yè)面),但是登陸以后出現(xiàn)界面是無(wú)法顯示(空白頁(yè)面)。
原因分析
因?yàn)槭菃⒂?Spring Security 以后出現(xiàn)的問(wèn)題,問(wèn)題根源可能就是 Spring Security 的安全配置問(wèn)題。我們可以去開(kāi)啟 Spring Security 的 debug 日志,查看日志分析原因,但是詳細(xì)的分析這里就不細(xì)說(shuō)了。
Spring Boot 在配置文件啟用 Security 模塊的日志輸出如下,具體是設(shè)置 org.springframework.security 包的日志輸出級(jí)別為debug:
logging:
level:
root: info
com.hdfg159: debug
org:
springframework:
web: debug
security: debug
解決方案
根據(jù)上面的日志輸出,我們可以得到問(wèn)題的根源。
情況 1 :
Spring Security 默認(rèn)開(kāi)啟了 CSRF 的保護(hù),H2Database 相關(guān)的請(qǐng)求需要攜帶 CSRF Token 及相關(guān)參數(shù),所以訪問(wèn)時(shí)候出現(xiàn)了 403 。
方案 1 :
我們可以去修改 Spring Security 的相關(guān)安全配置,把 CSRF 保護(hù)關(guān)掉,編寫(xiě)安全配置文件繼承 WebSecurityConfigurerAdapter 并覆寫(xiě) protected void configure(HttpSecurity http) throws Exception 方法,加入以下代碼:
http.csrf().disable();
不過(guò)不建議這樣做,安全性不高。
方案 2 :
操作同方案 1 ,但是配置項(xiàng)寫(xiě)法不一樣,具體代碼如下(
/h2-console 是配置好的 H2Database 控制臺(tái)訪問(wèn)路徑):
http.csrf().ignoringAntMatchers("/h2-console/**")
情況2:
Spring Security 默認(rèn)頁(yè)面不允許 iframe (不安全),會(huì)在響應(yīng)頭返回:
X-Frame-Options:DENY
導(dǎo)致 H2Database 訪問(wèn)頁(yè)面空白,解決方案也是有兩種,同理情況 1 中配置 CSRF 的方式。
方案 1 :
禁用 frameOptions(),具體代碼如下:
http.headers().frameOptions().disable();
方案 2 :
允許同源使用 iframe ,具體代碼如下:
http.headers().frameOptions().sameOrigin();