在带有 Spring Security 的 Spring Boot 中使用 H2 数据库控制台

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在开发基于 Spring 的应用程序时,您会经常在开发过程中使用 H2 内存数据库。它轻便、快速且易于使用。它通常可以很好地模拟您在生产中经常看到的其他 RDBM(即 Oracle、MySQL、Postgres)。在开发 Spring 应用程序时,通常使用 JPA/Hibernate 并利用 Hibernate 的模式生成功能。使用 H2,每次启动应用程序时,Hibernate 都会创建您的数据库。因此,数据库以已知且一致的状态启动。它还允许您开发和测试 JPA 映射。

H2 附带一个基于 Web 的数据库控制台,您可以在开发应用程序时使用它。这是查看 Hibernate 创建的表并对内存数据库运行查询的便捷方式。这是 H2 数据库控制台的示例。

为 H2 数据库控制台配置 Spring Boot

H2 Maven 依赖

Spring Boot 内置了对 H2 数据库的强大支持。如果您使用 Spring Initializr 将 H2 作为选项包含在内,则 H2 依赖项将添加到您的 Maven POM,如下所示:


 <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

此设置非常适合开箱即用地使用 H2 数据库运行我们的 Spring Boot 应用程序,但如果要启用 H2 数据库控制台的使用,我们需要从运行时更改 Maven 的范围以进行编译。这是支持我们需要对 Spring Boot 配置进行的更改所必需的。只要去掉scope语句,Maven就会变成默认的compile。

Maven POM 中的 H2 数据库依赖项应如下所示:


 <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

弹簧配置

通常,您会将 web.xml 文件中的 H2 数据库配置为 servlet,但 Spring Boot 将使用 Tomcat 的嵌入式实例,因此我们无权访问 web.xml 文件。 Spring Boot 确实为我们提供了一种机制,可用于通过 Spring Boot ServletRegistrationBean 声明 servlet。

以下 Spring Configuration 声明了 H2 数据库控制台的 servlet 包装器并将其映射到 /console 的路径。

Web配置.java

注意 – 请务必导入正确的 WebServlet 类(来自 H2)。


 <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

如果您没有将 Spring Security 与 H2 数据库控制台一起使用,这就是您需要做的全部。当您运行 Spring Boot 应用程序时,您现在可以通过 http://localhost:8080/console 访问 H2 数据库控制台。

弹簧安全配置

如果您在 Spring Boot 应用程序中启用了 Spring Security,您将无法访问 H2 数据库控制台。使用 Spring Boot 下的默认设置,Spring Security 将阻止对 H2 数据库控制台的访问。

要在 Spring Security 下启用对 H2 数据库控制台的访问,您需要更改三件事:

  • 允许所有访问 url 路径 /console/*。
  • 禁用 CRSF(跨站点请求伪造)。默认情况下,Spring Security 将 防止 CRSF 攻击。
  • 由于 H2 数据库控制台在框架内运行,因此您需要在 Spring Security 中启用它。

以下 Spring 安全配置将:

  • 允许对根 url(“/”)的所有请求(第 12 行)
  • 允许对 H2 数据库控制台 url(“/console/*”)的所有请求(第 13 行)
  • 禁用 CSRF 保护(第 15 行)
  • 在 Spring Security 中禁用 X-Frame-Options (第 16 行)

注意 :这不是您想要用于生产网站的 Spring 安全配置。这些设置仅用于支持 Spring Boot Web 应用程序的开发并启用对 H2 数据库控制台的访问。我想不出一个示例,您实际上希望在生产数据库上公开 H2 数据库控制台。

安全配置.java


 <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

使用 H2 数据库控制台

只需启动您的 Spring Boot Web 应用程序并导航到 url http://localhost:8080/console,您将看到 H2 数据库控制台的以下登录屏幕。

Spring Boot 默认 H2 数据库设置

在登录之前,请确保您具有正确的 H2 数据库设置。我很难找到 Spring Boot 使用的默认值,并且不得不使用 Hibernate 日志记录来找出 Spring Boot 使用的 JDBC Url。

价值 环境
司机班 org.h2.驱动程序
JDBC 网址 jdbc:h2:内存:testdb
用户名
密码 <空白>

结论

我使用 Grails 框架进行了大量开发工作。 Grails 团队在 Grails 2 的发布中添加了 H2 数据库控制台。我很快就爱上了这个特性。好吧,也许不是“爱”,但它成了我经常使用的 Grails 的一个特性。当您使用 Spring/Hibernate 开发应用程序时(就像您使用 Grails 一样),您将需要查看数据库。 H2 数据库控制台是一个供您使用的好工具。

也许我们会在未来的 Spring Boot 版本中将其视为默认选项。但是现在,您需要自己添加 H2 数据库控制台。你可以看到这不是很难做到。