spring-security 我如何配置Webflux安全的2步过滤器链

qybjjes1  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(313)

我需要支持两种类型的身份验证:
1.其中令牌由自动配置的过滤器注入。

  1. Postman 一样的用例,我们从一个内部应用程序获得令牌,并测试我们的服务返回什么。这只在我们的公司网络中工作(如果细节很重要)。
    我的任务是在服务器端验证令牌,如果其中一个方法有效,我就应该允许访问。
    我的初始(幼稚)实现代码演示了该功能:
RemoteAddressSource remoteAddressSource = new WebFluxRemoteAddressSource(exchange);
        return validateNotBlank(token)
                .switchIfEmpty(Mono.defer(() -> iafTokenValidator.validateToken(remoteAddressSource)
                        .onErrorResume(AuthenticationFailedException.class, e -> tfTokenValidator.validateToken(remoteAddressSource))))
                .onErrorResume(AuthenticationFailedException.class, e -> sendErrorResponse(e, exchange))
                .switchIfEmpty(chain);

虽然按预期工作、拒绝和允许,但此方法存在以下几个问题:
1.这将两种形式的身份验证结合在一起,而不是为它们设置两个类。
1.在无效的情况下,一般使用者一定会“看到”后一个错误消息,而它可能来自第一个方法。
1.我相信有一个适当的方法来做一个正确配置的过滤器链,虽然我还没有找到任何到这一点。

vc6uscn9

vc6uscn91#

我已经想出了一些有效的方法,尽管我并不完全满意。
我希望有一个解决方案,其中令牌通过两个选项运行,如果其中一个选项通过验证,则允许请求,但我希望它们完全分离,互不影响,我已经通过TokenAuthManager部分实现了这一点。
不过,当不赞成使用不信任形式时,我们需要更改AuthManager,而不是删除此代码。
此外,我不喜欢if语句和try/catch块用于React性操作符的异常处理,所以仍然不理想。
至少它在1个类中,所以我们没有看到很多工作:

@Override
    public Mono<Authentication> authenticate(Authentication authentication) {
        ServiceAuthentication serviceAuthentication = (ServiceAuthentication) authentication;
        String stripped = serviceAuthentication.getCredentials().toString().replaceAll("Bearer ", "").trim();
        try {
            ServicePrincipal principal = stv.validate(stripped, (String) serviceAuthentication.getDetails());
            log.debug("client {} from ip {} allowed", principal.getName(), authentication.getDetails());
            //if this is valid, return
            authentication.setAuthenticated(true);
            return Mono.just(authentication);
        } catch (TokenException e) {
            log.debug("token {} invalid for TF", authentication.getCredentials());
            if (serviceAuthentication.isPureTf()) {
                return Mono.error(new BadCredentialsException("The provided TF token is invalid", e));
            }
            return iafTokenValidator.authenticate(serviceAuthentication);
        }
    }

相关问题