当前位置: 首页 > news >正文

SpringSecurity实战:核心配置技巧

基于Spring Security的实例

以下是基于Spring Security的实用示例,涵盖认证、授权、OAuth2等常见场景,按功能分类整理:

基础认证与授权

  1. 表单登录配置
    配置默认表单登录页面,自定义登录路径和参数:

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().loginPage("/custom-login").usernameParameter("user").passwordParameter("pass");}
    }
    
  2. 内存用户存储
    快速测试时配置内存用户:

    @Bean
    public UserDetailsService users() {UserDetails user = User.builder().username("user").password("{noop}password").roles("USER").build();return new InMemoryUserDetailsManager(user);
    }
    
  3. JDBC用户存储
    通过JDBC连接数据库认证:

    @Autowired
    private DataSource dataSource;@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username=?").authoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username=?");
    }
    
  4. LDAP认证
    集成LDAP服务器认证:

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.ldapAuthentication().userDnPatterns("uid={0},ou=people").groupSearchBase("ou=groups").contextSource().url("ldap://localhost:8389/dc=example,dc=com");
    }
    
  5. 自定义登录成功处理
    登录成功后自定义逻辑:

    http.formLogin().successHandler((request, response, authentication) -> {response.sendRedirect("/dashboard");});
    

高级配置

  1. 方法级安全控制
    使用注解保护方法:

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public String adminPage() {return "admin";
    }
    
  2. CSRF防护禁用
    特定场景下禁用CSRF(如API服务):

    http.csrf().disable();
    
  3. CORS配置
    允许跨域请求:

    http.cors().configurationSource(request -> {CorsConfiguration config = new CorsConfiguration();config.addAllowedOrigin("*");config.addAllowedMethod("*");return config;
    });
    
  4. 多HttpSecurity配置
    针对不同URL路径应用不同安全规则:

    @Configuration
    @Order(1)
    public static class ApiSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.antMatcher("/api/**").authorizeRequests().anyRequest().authenticated();}
    }
    
  5. 自定义AccessDenied处理
    自定义403页面:

    http.exceptionHandling().accessDeniedHandler((request, response, ex) -> {response.sendRedirect("/403");});
    

OAuth2集成

  1. OAuth2登录配置
    集成Google登录:

    http.oauth2Login().clientRegistrationRepository(clientRegistrationRepository()).authorizedClientService(authorizedClientService());
    
  2. 自定义OAuth2用户服务
    处理OAuth2用户信息:

    @Bean
    public OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService() {return request -> {DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();OAuth2User user = delegate.loadUser(request);return new DefaultOAuth2User(user.getAuthorities(), user.getAttributes(), "sub");};
    }
    
  3. JWT资源服务器
    配置JWT验证的资源服务器:

    @Override
    protected void configure(HttpSecurity http) throws Exception {http.oauth2ResourceServer().jwt().decoder(jwtDecoder());
    }
    
  4. OAuth2客户端
    配置客户端凭证模式:

    @Bean
    public OAuth2AuthorizedClientManager authorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,OAuth2AuthorizedClientRepository authorizedClientRepository) {OAuth2AuthorizedClientProvider provider = OAuth2AuthorizedClientProviderBuilder.builder().clientCredentials().build();DefaultOAuth2AuthorizedClientManager manager = new DefaultOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);manager.setAuthorizedClientProvider(provider);return manager;
    }
    

安全进阶

  1. 自定义过滤器
    添加前置认证过滤器:

    http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class);
    
  2. IP白名单限制
    限制特定IP访问:

    http.authorizeRequests().antMatchers("/admin/**").hasIpAddress("192.168.1.100");
    
  3. 会话固定保护
    防止会话固定攻击:

    http.sessionManagement().sessionFixation().migrateSession();
    
  4. 密码加密配置
    使用BCrypt加密:

    @Bean
    public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
    }
    
  5. H2控制台安全
    开发环境允许H2控制台访问:

    http.headers().frameOptions().disable().and().authorizeRequests().antMatchers("/h2-console/**").permitAll();
    

响应式安全

  1. WebFlux基础配置
    响应式安全配置:

    @Bean
    SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {return http.authorizeExchange().pathMatchers("/admin/**").hasRole("ADMIN").anyExchange().authenticated().and().formLogin().and().build();
    }
    

  2. 响应式方法安全
    启用响应式方法注解:

    @EnableReactiveMethodSecurity
    public class SecurityConfig {@Beanpublic MapReactiveUserDetailsService userDetailsService() {UserDetails user = User.withUsername("user").password("{noop}password").roles("USER").build();return new MapReactiveUserDetailsService(user);}
    }
    

测试相关

  1. 测试安全配置
    Mock用户进行测试:

    @Test
http://www.dtcms.com/a/300461.html

相关文章:

  • 【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
  • 【C++基础】类型转换:static_cast/dynamic_cast 面试高频考点与真题解析
  • Spring Retry 异常重试机制:从入门到生产实践
  • ESP32学习-FreeRTOS队列使用指南与实战
  • 【多模态】天池AFAC赛道四-智能体赋能的金融多模态报告自动化生成part2-报告输出
  • Java面试实战:企业级性能优化与JVM调优全解析
  • 小白成长之路-Ansible自动化(一)
  • 将远程 main 分支同步到 develop 分支的完整指南
  • 【硬件】嵌入式软件开发(2)
  • STM32-USART串口实现接收数据三种方法(1.根据\r\n标志符、2.空闲帧中断、3.根据定时器辅助接收)
  • Pytest 参数化进阶:掌握 parametrize 的多种用法
  • HCIP---MGRE实验
  • 嵌入式硬件篇---ESP32稳压板
  • OpenLayers 综合案例-轨迹回放
  • LeetCode|Day27|70. 爬楼梯|Python刷题笔记
  • catkin_make与catkin build的关系与区别(使用catkin build的好处)
  • MGRE实验
  • 深入解析 Vue 3 中 v-model 与表单元素的绑定机制
  • 多租户Kubernetes集群架构设计实践——隔离、安全与弹性扩缩容
  • Spring Boot自动配置原理深度解析
  • 昇思学习营-模型推理和性能优化
  • Keepalived + LVS-DR 高可用与负载均衡实验
  • 【Python系列】使用 memory_profiler 诊断 Flask 应用内存问题
  • 结构化文本文档的内容抽取与版本重构策略
  • 8. 状态模式
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情分析实现
  • vLLM 的“投机取巧”:Speculative Decoding 如何加速大语言模型推理
  • Spring Boot2错误处理
  • 负载均衡 LoadBalance
  • Spring Boot音乐服务器项目-查询音乐模块