Spring webflux 安全性与后端的模拟用户

Posted

技术标签:

【中文标题】Spring webflux 安全性与后端的模拟用户【英文标题】:Spring webflux security with mock user for the backend 【发布时间】:2021-05-11 16:45:09 【问题描述】:

我的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 测试此 API,仅使用 userId 为 1 的模拟用户,而不是使用真实用户登录,因为前端尚未准备好。

如何使用模拟用户运行 Spring Boot 应用程序并在调用 getUser() 方法时返回模拟用户 ID,以便进行端到端测试。

【问题讨论】:

你试过什么?发布您尝试过的内容和错误代码,您可以像在 Spring Boot 中模拟任何其他功能一样模拟一个函数。如果你不知道,我建议你谷歌一下 spring boot 官方文档并阅读测试 spring boot 应用程序的章节,然后尝试编写一个测试,如果你遇到一个特定的错误,你将它与代码一起发布在这里。 【参考方案1】:

我可以通过下面的代码实现这一点。

为 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());
    


【讨论】:

以上是关于Spring webflux 安全性与后端的模拟用户的主要内容,如果未能解决你的问题,请参考以下文章

在VR中模拟用鼠标操作电脑并实现简单画图的小程序

Spring Webflux + LDAP/Kerberos 安全性

如何在spring webflux安全中通过绕过选项请求?

Spring WebFlux 安全自定义 AccessDeniedHandler

使用 JWT 令牌的 Spring Boot webflux 安全性

带有 Spring 安全 webflux 的 Angular 6 被 CORS 阻止