webflux的后台模拟用户安全性

2izufjch  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(232)

我的SpringWebFlux安全代码是,

@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来创建一个项目,项目表有audit列以及createdby user。我使用上面的代码(getuser()方法)检索登录的用户并从中获取userid。
现在,尝试通过postman测试这个api,只使用一个用户id为1的模拟用户,而不是使用真正的用户登录,因为前端还没有准备好。
如何在调用getuser()方法时使用mock user运行spring启动应用程序并返回mock user id,以便进行端到端测试。

lskq00tm

lskq00tm1#

我可以通过下面的代码实现这一点。
为mock user创建了一个基于条件的类。

@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());
    }

}

相关问题