我需要支持两种类型的身份验证:
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.我相信有一个适当的方法来做一个正确配置的过滤器链,虽然我还没有找到任何到这一点。
1条答案
按热度按时间vc6uscn91#
我已经想出了一些有效的方法,尽管我并不完全满意。
我希望有一个解决方案,其中令牌通过两个选项运行,如果其中一个选项通过验证,则允许请求,但我希望它们完全分离,互不影响,我已经通过TokenAuthManager部分实现了这一点。
不过,当不赞成使用不信任形式时,我们需要更改AuthManager,而不是删除此代码。
此外,我不喜欢if语句和try/catch块用于React性操作符的异常处理,所以仍然不理想。
至少它在1个类中,所以我们没有看到很多工作: