0

0

使用 Lambda DSL 安全配置 H2 控制台

霞舞

霞舞

发布时间:2025-10-30 21:59:01

|

171人浏览过

|

来源于php中文网

原创

使用 lambda dsl 安全配置 h2 控制台

本文旨在介绍如何使用 Spring Security 的 Lambda DSL 安全地配置 H2 控制台。通过示例代码和详细解释,帮助开发者理解并掌握使用 Lambda DSL 配置 H2 控制台的正确方法,避免常见的配置错误,确保应用程序的安全性。

Spring Security 提供了 Lambda DSL,使得安全配置更加简洁和易读。然而,在使用 Lambda DSL 配置 H2 控制台时,可能会遇到一些问题。本文将详细介绍如何使用 Lambda DSL 正确地配置 H2 控制台,并提供一些常见的错误示例和解决方法

核心思路:一致使用 Lambda 语法

在使用 Lambda DSL 时,需要保持一致的语法风格。如果使用了 Lambda DSL 来配置 authorizeRequests,那么也应该使用 Lambda DSL 来配置 csrf 和 headers 等。

正确配置示例

以下是使用 Lambda DSL 安全配置 H2 控制台的示例代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;

import static org.springframework.security.config.Customizer.withDefaults;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception {
        MvcRequestMatcher h2ConsoleMatcher = new MvcRequestMatcher(introspector, "/h2-console/**");
        h2ConsoleMatcher.setRegistered(true);

        http
            .authorizeHttpRequests((authz) -> authz
                .requestMatchers(h2ConsoleMatcher).authenticated()
                .anyRequest().authenticated()
            )
            .formLogin(withDefaults())
            .csrf(csrf -> csrf.ignoringRequestMatchers(h2ConsoleMatcher))
            .headers(headers -> headers.frameOptions().sameOrigin());
        return http.build();
    }
}

代码解释:

  1. authorizeHttpRequests: 使用 Lambda 表达式 (authz) -> ... 配置授权规则。requestMatchers(h2ConsoleMatcher).authenticated() 表示对 /h2-console/** 下的请求需要进行身份验证。anyRequest().authenticated() 表示所有其他请求也需要身份验证。
  2. formLogin(withDefaults()): 启用默认的表单登录。
  3. csrf: 使用 Lambda 表达式 csrf -> csrf.ignoringRequestMatchers(h2ConsoleMatcher) 配置 CSRF 保护,并忽略对 /h2-console/** 的 CSRF 保护。 由于Spring Security 6 默认开启了CSRF保护,因此需要显式地忽略H2控制台。
  4. headers: 使用 Lambda 表达式 headers -> headers.frameOptions().sameOrigin() 配置 HTTP 头部,设置 frameOptions 为 sameOrigin,允许同源域名下的页面嵌入 H2 控制台。

常见错误示例及解决方法

以下是一些常见的错误示例以及如何解决它们:

  • 混合使用旧语法和 Lambda DSL:

    错误示例:

    http
        .authorizeRequests((authz) -> authz
            .antMatchers("/h2-console/**").authenticated()
            .anyRequest().authenticated()
        )
        .formLogin()
        .csrf().ignoringAntMatchers("/h2-console/**")
        .headers().frameOptions().sameOrigin();

    解决方法:

    保持一致的 Lambda DSL 风格,使用 csrf(csrf -> csrf.ignoringAntMatchers("/h2-console/**")) 和 headers(headers -> headers.frameOptions().sameOrigin())。

  • csrf() 方法未定义:

    错误信息:The method csrf() is undefined for the type FormLoginConfigurer

    原因:使用了不正确的语法,csrf() 方法应该在 HttpSecurity 对象上调用,而不是在 FormLoginConfigurer 对象上。

    解决方法:

    使用 Lambda DSL 配置 csrf,例如:http.csrf(csrf -> csrf.ignoringAntMatchers("/h2-console/**"))。

注意事项

  • Spring Security 6 默认启用了 CSRF 保护,因此需要显式地禁用对 H2 控制台的 CSRF 保护,否则将无法访问 H2 控制台。

  • 确保在 application.properties 或 application.yml 文件中启用 H2 控制台:

    spring.h2.console.enabled=true
  • 如果使用了自定义的登录页面,需要确保登录页面包含 CSRF token。

总结

使用 Spring Security 的 Lambda DSL 可以更简洁地配置 H2 控制台的安全策略。关键在于保持一致的 Lambda DSL 语法,并注意 Spring Security 6 的默认 CSRF 保护机制。通过本文提供的示例代码和注意事项,可以避免常见的配置错误,确保 H2 控制台的安全访问。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

106

2025.08.06

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6105

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

811

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1064

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1276

2024.03.01

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

50

2026.01.05

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 49.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号