大数跨境
0
0

SpringBoot整合新版Spring Security:Lambda表达式配置更优雅

SpringBoot整合新版Spring Security:Lambda表达式配置更优雅 终码一生
2025-12-09
0
点击“终码一生”,关注,置顶公众号
每日技术干货,第一时间送达!
Spring Security是保障Spring应用程序安全的强大框架,而新版的Spring Security引入了lambda表达式来配置,使得安全配置更加简洁、优雅。本文将介绍如何在Spring Boot项目中整合新版Spring Security,并通过lambda表达式进行安全配置,提供更好的开发体验。

01
引言
Spring Security是一个用于身份验证和授权的框架,它提供了一套全面的安全服务,可轻松集成到Spring应用程序中。新版Spring Security引入了lambda表达式的配置方式,取代了之前的繁琐XML配置和方法调用链式配置,使得配置更加清晰、简洁。
02
项目依赖配置
首先,确保你的Spring Boot项目中包含了Spring Security的依赖。在pom.xml中添加以下依赖:
<!-- Spring Security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

03
使用Lambda表达式配置Spring Security
在新版Spring Security中,使用lambda表达式配置可以显著提高配置的可读性和可维护性。以下是一个简单的例子,展示如何使用lambda表达式配置基本的身份验证和授权。
@Configuration
@EnableWebSecurity
publicclass SecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();

        returnnew InMemoryUserDetailsManager(user);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Configuration
    publicclass WebSecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/""/home").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                .logout()
                    .permitAll();
        }
    }
}
上述配置中,我们使用lambda表达式配置了一个简单的身份验证和授权。 userDetailsService 方法配置了一个内存中的用户,configure方法配置了访问权限和登录页面。

04
自定义身份验证逻辑
在实际项目中,我们通常需要实现自定义的身份验证逻辑。通过lambda表达式,我们可以更清晰地定义自己的 UserDetailsService 和 AuthenticationProvider 。
@Configuration
@EnableWebSecurity
publicclass CustomSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(customUserDetailsService);
        provider.setPasswordEncoder(passwordEncoder());
        return provider;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
}
在上述配置中,我们注入了一个自定义的 UserDetailsService ,并通过lambda表达式配置了 AuthenticationProvider 。这样我们可以更灵活地定义用户信息的获取和身份验证逻辑。

05
认证与授权注解
新版Spring Security还引入了一系列基于注解的认证与授权。通过lambda表达式,我们可以更直观地配置这些注解。
5.1 @Secured注解
@Configuration
@EnableWebSecurity
publicclass SecuredSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Secured("ROLE_ADMIN")
    @GetMapping("/admin")
    public String adminPage() {
        return"admin";
    }
}
在上述代码中,通过 @Secured("ROLEADMIN") 注解配置了访问路径 /admin 需要具备 ROLEADMIN 角色。
5.2 @PreAuthorize和@PostAuthorize注解
@Configuration
@EnableWebSecurity
publicclass PrePostSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public String adminPage() {
        return"admin";
    }

    @PostAuthorize("hasRole('USER')")
    @GetMapping("/user")
    public String userPage() {
        return"user";
    }
}
在上述代码中,通过 @PreAuthorize 和 @PostAuthorize 注解分别配置了方法的前置和后置授权规则。

06
总结
通过本文的介绍,我们学习了如何在Spring Boot项目中整合新版Spring Security,并通过lambda表达式进行简洁、优雅的安全配置。新版Spring Security的引入使得配置更加直观,开发者可以更轻松地实现自定义的身份验证逻辑和授权规则。
希望通过本文的学习,读者能够更加熟练地使用Spring Security保障应用程序的安全性。
来源:blog.csdn.net/qq_43546721/article/details/136054719
END
PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。



往期推荐



就写了个 insert into select,居然被开了

目前工资最高的几家外包公司汇总!(2025 最新版)

Spring AI+DeepSeek,10分钟快速构建本地化AI对话系统!

开源项目|35k Star,一款免费高效的在线数据库设计神器

支付宝崩了,淘宝崩了,闲鱼崩了...

超硬核:SpringBoot+ResponseBodyEmitter异步流式推送神技,非常强大!


【声明】内容源于网络
0
0
终码一生
开发者聚集地。分享Java相关开发技术(JVM,多线程,高并发,性能调优等),开源项目,常见开发问题和前沿科技资讯!
内容 1876
粉丝 0
终码一生 开发者聚集地。分享Java相关开发技术(JVM,多线程,高并发,性能调优等),开源项目,常见开发问题和前沿科技资讯!
总阅读132
粉丝0
内容1.9k