为My Retro应用添加安全防护
My Retro应用安全架构设计
My Retro应用采用Reactive技术栈构建,通过与Spring Security和Spring Boot的深度集成,实现了基于WebFlux的安全自动配置机制。该安全架构的核心设计理念是将用户认证与授权功能解耦:用户应用(User App)负责用户信息存储与查询,而My Retro应用则基于安全配置规则对用户信息实施保护。
Reactive安全集成原理
在build.gradle配置中,关键安全依赖包括:
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
WebFlux安全架构通过SecurityWebFilterChain
接口实现,这是Reactive环境下SecurityFilterChain
的对应实现,专门处理Mono和Flux类型的数据流。与Servlet架构不同,Reactive安全配置需要特别处理以下核心组件:
- ServerHttpSecurity:配置请求级安全规则
- ReactiveAuthenticationManager:实现响应式认证逻辑
- CorsConfigurationSource:管理跨域请求策略
认证授权分离架构
用户认证通过UserClient
类实现与用户应用的交互,该类使用WebClient进行响应式HTTP调用:
@Component
public class UserClient {private final WebClient webClient;public UserClient(WebClient.Builder builder, MyRetroProperties props) {this.webClient = builder.baseUrl(props.getUsers().getServer()).defaultHeaders(headers -> headers.setBasicAuth(props.getUsers().getUsername(),props.getUsers().getPassword())).build();}public Mono getUserInfo(String email) {return webClient.get().uri("/users/{email}", email).retrieve().bodyToMono(User.class);}
}
授权配置在RetroBoardSecurityConfig
类中实现,通过路径匹配规则定义访问控制:
@Bean
SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {http.csrf().disable().authorizeExchange().pathMatchers(HttpMethod.POST,"/retros/**").hasRole("ADMIN").pathMatchers(HttpMethod.DELETE,"/retros/**").hasRole("ADMIN").pathMatchers("/retros/**").hasAnyRole("USER","ADMIN").pathMatchers("/","/webjars/**").permitAll().and().formLogin().httpBasic();return http.build();
}
安全数据流设计
系统安全数据流包含以下关键处理环节:
-
认证流程:
- 用户提交邮箱/密码凭证
ReactiveAuthenticationManager
通过UserClient验证凭证- 生成包含权限信息的
UsernamePasswordAuthenticationToken
-
会话管理:
@Bean ServerAuthenticationSuccessHandler successHandler() {return (exchange, auth) -> {User user = (User) auth.getDetails();return exchange.getExchange().getSession().flatMap(session -> {// 构建包含用户详情的JSON响应String body = buildUserJson(auth, user);// 设置安全响应头exchange.getExchange().getResponse().getHeaders().add("X-MYRETRO", "SESSION="+session.getId());return response.writeWith(body);});}; }
-
跨域安全:
@Bean CorsConfigurationSource corsConfig() {CorsConfiguration config = new CorsConfiguration();config.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE"));config.setAllowedHeaders(Arrays.asList("Authorization","Content-Type"));config.setAllowedOriginPatterns(Arrays.asList("http://localhost:*"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return source; }
该架构通过响应式编程模型实现了非阻塞的安全控制流程,同时保持了与Spring Security核心功能的一致性。安全测试可采用@WebFluxTest
结合@WithMockUser
注解模拟不同权限用户的访问场景。
build.gradle安全依赖配置详解
在My Retro应用中,安全模块的依赖管理通过build.gradle文件实现。关键安全依赖包括:
dependencies {// Reactive安全核心依赖implementation 'org.springframework.boot:spring-boot-starter-webflux'implementation 'org.springframework.boot:spring-boot-starter-security'// 数据层安全支持implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'// 开发工具链developmentOnly 'org.springframework.boot:spring-boot-docker-compose'implementation 'org.springframework.boot:spring-boot-devtools'// 测试相关依赖testImplementation 'org.springframework.security:spring-security-test'testImplementation 'io.projectreactor:reactor-test'
}
该配置特点:
- 使用Spring Boot 3.2.3作为基础框架版本
- 集成WebFlux响应式安全starter
- 包含MongoDB Reactive驱动支持
- 开发阶段启用Docker Compose和DevTools
- 测试环境配置了安全测试和Reactor测试支持
UserClient类的Reactive通信实现
UserClient
类作为与用户服务通信的核心组件,采用响应式编程模型实现:
@Component
public class UserClient {private final WebClient webClient;public UserClient(WebClient.Builder builder, MyRetroProperties props) {this.webClient = builder.baseUrl(props.getUsers().getServer()).defaultHeaders(headers -> headers.setBasicAuth(props.getUsers().getUsername(),props.getUsers().getPassword()))