首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Spring Webflux应用程序实现自定义的Spring Security PreAuthentication场景?

如何为Spring Webflux应用程序实现自定义的Spring Security PreAuthentication场景?
EN

Stack Overflow用户
提问于 2018-04-09 22:23:24
回答 1查看 772关注 0票数 2

为了使用Webflux使基于Spring MVC的应用程序现代化,我需要更新我的自定义PreAuthentication场景。我已经使用FilterBeans (如https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#preauth中描述的)构建了一个很好的解决方案。

但是,我找不到一个好的起点来将此解决方案迁移到反应式场景。有人能帮我指出正确的方向吗?

EN

回答 1

Stack Overflow用户

发布于 2018-09-28 23:13:04

我也处于同样的境地。尝试使用容器身份验证( Spring MVC中的preauth.j2ee),但尚未找到完整的解决方案。

我无法访问通过我的归档存储认证系统认证的java.security.PrincipalserverWebExchange.getPrincipal()总是空的。

既然您要求的是一个起点,下面是我的配置:

代码语言:javascript
复制
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
@Slf4j
public class SecurityConfig {
@Bean
    public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) {
        return http
                .csrf().disable()
                .httpBasic().disable()
                .formLogin().disable()
                .logout().disable()

                .authenticationManager(this.authenticationManager())
                .securityContextRepository(this.securityContextRepository())
                .authorizeExchange().pathMatchers("/public/**").permitAll()
                .and().authorizeExchange().anyExchange().authenticated()
                .and().build();
    }

    @Bean
    ReactiveAuthenticationManager authenticationManager() {
        return authentication -> {
            log.debug("Autentication: " + authentication.toString());
            if (authentication instanceof CustomPreAuthenticationToken) {
                authentication.setAuthenticated(true);
            }

            return Mono.just(authentication);
        };
    }

    @Bean
    ServerSecurityContextRepository securityContextRepository() {
        return new ServerSecurityContextRepository() {
            @Override
            public Mono<Void> save(ServerWebExchange serverWebExchange, SecurityContext securityContext) {
                return null;
            }

            @Override
            public Mono<SecurityContext> load(ServerWebExchange serverWebExchange) {
                return serverWebExchange.getPrincipal()
                        .defaultIfEmpty(() -> "empty principal")
                        .flatMap(principal -> Mono.just(new SecurityContextImpl(new CustomPreAuthenticationToken(principal.getName(), principal,  AuthorityUtils.createAuthorityList("ROLE_USER") ))));
            }
        };
    }
}



public class CustomPreAuthenticationToken extends UsernamePasswordAuthenticationToken {        
    public CustomPreAuthenticationToken(String key, Object principal, Collection<? extends GrantedAuthority> authorities) {
        super(key, principal, authorities);
    }
}

希望这里有人能回答这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49735268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档