相关推荐recommended
Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全
作者:mmseoamin日期:2024-02-18

文章目录

    • 1. 引言
    • 2. 项目依赖配置
    • 3. 使用Lambda表达式配置Spring Security
    • 4. 自定义身份验证逻辑
    • 5. 认证与授权注解
      • 5.1 @Secured注解
      • 5.2 @PreAuthorize和@PostAuthorize注解
      • 6. 总结

        Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全,在这里插入图片描述,第1张

        🎉Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全


        • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
        • ✨博客主页:IT·陈寒的博客
        • 🎈该系列文章专栏:架构设计
        • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
        • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
        • 📜 欢迎大家关注! ❤️

        Spring Security是保障Spring应用程序安全的强大框架,而新版的Spring Security引入了lambda表达式来配置,使得安全配置更加简洁、优雅。本文将介绍如何在Spring Boot项目中整合新版Spring Security,并通过lambda表达式进行安全配置,提供更好的开发体验。

        1. 引言

        Spring Security是一个用于身份验证和授权的框架,它提供了一套全面的安全服务,可轻松集成到Spring应用程序中。新版Spring Security引入了lambda表达式的配置方式,取代了之前的繁琐XML配置和方法调用链式配置,使得配置更加清晰、简洁。Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全,在这里插入图片描述,第2张

        2. 项目依赖配置

        首先,确保你的Spring Boot项目中包含了Spring Security的依赖。在pom.xml中添加以下依赖:

        
        
            org.springframework.boot
            spring-boot-starter-security
        
        

        3. 使用Lambda表达式配置Spring Security

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

        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.core.userdetails.User;
        import org.springframework.security.core.userdetails.UserDetails;
        import org.springframework.security.core.userdetails.UserDetailsService;
        import org.springframework.security.core.userdetails.UsernameNotFoundException;
        import org.springframework.security.provisioning.InMemoryUserDetailsManager;
        @Configuration
        @EnableWebSecurity
        public class SecurityConfig {
            @Bean
            public UserDetailsService userDetailsService() {
                UserDetails user = User.withDefaultPasswordEncoder()
                        .username("user")
                        .password("password")
                        .roles("USER")
                        .build();
                return new InMemoryUserDetailsManager(user);
            }
            @Bean
            public PasswordEncoder passwordEncoder() {
                return PasswordEncoderFactories.createDelegatingPasswordEncoder();
            }
            @Configuration
            public class 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方法配置了访问权限和登录页面。

        4. 自定义身份验证逻辑

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

        @Configuration
        @EnableWebSecurity
        public class 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。这样我们可以更灵活地定义用户信息的获取和身份验证逻辑。

        5. 认证与授权注解

        新版Spring Security还引入了一系列基于注解的认证与授权。通过lambda表达式,我们可以更直观地配置这些注解。

        5.1 @Secured注解

        @Configuration
        @EnableWebSecurity
        public class 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("ROLE_ADMIN")注解配置了访问路径/admin需要具备ROLE_ADMIN角色。

        5.2 @PreAuthorize和@PostAuthorize注解

        @Configuration
        @EnableWebSecurity
        public class 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注解分别配置了方法的前置和后置授权规则。

        6. 总结

        通过本文的介绍,我们学习了如何在Spring Boot项目中整合新版Spring Security,并通过lambda表达式进行简洁、优雅的安全配置。新版Spring Security的引入使得配置更加直观,开发者可以更轻松地实现自定义的身份验证逻辑和授权规则。希望通过本文的学习,读者能够更加熟练地使用Spring Security保障应用程序的安全性。


        🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏

        📜您可能感兴趣的内容:

        • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
        • 【Java学习路线】2023年完整版Java学习路线图
        • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
        • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
        • 【数据结构学习】从零起步:学习数据结构的完整路径

          Spring Boot整合新版Spring Security:Lambda表达式配置优雅安全,在这里插入图片描述,第3张