前言
- 此文也是自己在编程上遇到问题的一些记录,希望能给大家带来一些帮助😂
问题
Spring Boot 启用 Spring Security 以后发现 H2 Database 的控制台登陆页面是无法访问的。
情况 1 :
能进去控制台的登陆页面(输入数据库用户名和密码的页面),但是登陆以后出现白标签页错误( White Label Error )
,返回码是 403
。
情况 2 :
能进去控制台的登陆页面(输入数据库用户名和密码的页面),但是登陆以后出现界面是无法显示(空白页面)。
原因分析
因为是启用 Spring Security 以后出现的问题,问题根源可能就是 Spring Security 的安全配置问题。我们可以去开启 Spring Security 的 debug 日志,查看日志分析原因,但是详细的分析这里就不细说了。
Spring Boot 在配置文件启用 Security 模块的日志输出如下,具体是设置 org.springframework.security
包的日志输出级别为debug
:
logging:
level:
root: info
com.hdfg159: debug
org:
springframework:
web: debug
security: debug
解决方案
根据上面的日志输出,我们可以得到问题的根源。
情况 1 :
Spring Security 默认开启了 CSRF
的保护,H2Database 相关的请求需要携带 CSRF Token 及相关参数,所以访问时候出现了 403 。
方案 1 :
我们可以去修改 Spring Security 的相关安全配置,把 CSRF
保护关掉,编写安全配置文件继承 WebSecurityConfigurerAdapter
并覆写 protected void configure(HttpSecurity http) throws Exception
方法,加入以下代码:
http.csrf().disable();
不过不建议这样做,安全性不高。
方案 2 :
操作同方案 1 ,但是配置项写法不一样,具体代码如下(
/h2-console
是配置好的 H2Database 控制台访问路径):
http.csrf().ignoringAntMatchers("/h2-console/**")
情况2:
Spring Security 默认页面不允许 iframe
(不安全),会在响应头返回:
X-Frame-Options:DENY
导致 H2Database 访问页面空白,解决方案也是有两种,同理情况 1 中配置 CSRF
的方式。
方案 1 :
禁用 frameOptions()
,具体代码如下:
http.headers().frameOptions().disable();
方案 2 :
允许同源使用 iframe
,具体代码如下:
http.headers().frameOptions().sameOrigin();