spring - Spring webflux 安全性与后端的模拟用户
问题描述
我的 spring webflux 安全代码是,
@Bean
public SecurityWebFilterChain securitygWebFilterChain(final ServerHttpSecurity http) {
http.securityContextRepository(securityContextRepository);
return http.authorizeExchange().matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.pathMatchers(props.getSecurity().getIgnorePatterns()).permitAll().anyExchange().authenticated()
.and().formLogin()
.and().exceptionHandling()
.authenticationEntryPoint((exchange, exception) -> Mono.error(exception))
.accessDeniedHandler((exchange, exception) -> Mono.error(exception))
.and().build();
}
现在,我有下面的代码来获取登录的用户详细信息。
public Mono<AppUserDetails> getUser() {
Mono<Principal> principalMono = ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication).cast(Principal.class);
principalMono.flatMap(principal -> {
if (principal instanceof AuthenticatedUserToken) {
final AppUserDetails user = ((AuthenticatedUserToken<?>) principal).getUser();
return Mono.just(user);
}
return Mono.error(() -> new IllegalArgumentException("Invalid access"));
}).switchIfEmpty(Mono.defer(() -> {
return Mono.empty();
}));
}
我有一个创建项目的 API,项目表有审计列,就像 createdBy 用户一样。我正在使用上面的代码( getUser() 方法)来检索登录的用户并从那里获取 userId。
现在,尝试通过 postman 仅使用 userId 1 的模拟用户测试此 API,而不是使用真实用户登录,因为前端尚未准备好。
如何使用模拟用户运行 Spring Boot 应用程序并在调用 getUser() 方法时返回模拟用户 ID,以便我可以端到端测试。
解决方案
我可以使用下面的代码来实现这一点。
为 Mock 用户创建了一个基于条件的类。
@ConditionalOnProperty(prefix = "admin.service", value = "security.mode", havingValue = "MOCK")
@EnableWebFluxSecurity
public class MockSecurityConfig {
@Autowired
private AppProperties appProps;
@Bean
public SecurityWebFilterChain securitygWebFilterChain(final ServerHttpSecurity http) {
return http.authorizeExchange().pathMatchers("/**").permitAll().and().csrf().disable().build();
}
@Bean
public AuthenticatedPrinciplaProvider mockSecurityPrincipalProvider() {
return new MockSecurityContextPrincipleProvider(props.getSecurity().getMock());
}
}
推荐阅读
- c++ - 为什么我必须为分配器的一个实例分配一个值?
- c# - 数据模板不适用
- javascript - 级联反应组件
- c# - System.InvalidOperationException: '没有为具有不变名称'System.Data.SQLite' 的 ADO.NET 提供程序找到实体框架提供程序
- rust - 不可变对象根据函数签名更改为可变对象
- c# - 如果对象实现了这个接口,如何从接口调用方法?
- javascript - 当我设置可见性时,不透明度不会返回 1:可见
- python - discord.py:如何计算 JSON 文件中的所有值?
- html - 为什么我的文章部分在我的页脚后面而不是向下推?(仅使用 HTML5 和 CSS3 媒体查询)
- swift - SKAction & SKSpriteNode 麻烦