Spring 安全反应混合 HttpBasic + Oauth2

Spring security reactive mixing HttpBasic + Oauth2

我正在尝试使用 Security Webflux 配置,我可以使用 httpBasic 登录某些资源,其余资源使用 oAuth

到目前为止,我还无法理解该怎么做;似乎,以非反应性方式,可以使用某种领域名称或其他但不存在的反应性方式来实现,我认为这是因为与线程的工作流或与网络中的线程相关的东西有关过滤器链

但是我现在在 kotlin 中有以下内容,

return http.httpBasic().authenticationManager {...}
    .and()
       .oauth2ResourceServer()
          .jwt()
          .and()
    .and()
    .authorizeExchange()
    .pathMatchers(* noAuthPaths).permitAll()
    .pathMatchers(* basicAuthPaths).authenticated()
    .anyExchange().access{...}
    .and().csrf().disable()
    .build()

检查 noAuthPathsbasicAuthPaths 是否只是字符串模式数组,最后一个数组(basicAuthPaths) 是我想使用 HttpBasic 的那个。

如果我在浏览器中调用该资源,并且它列在 basicAuthPaths 中,我希望弹出登录请求 Basic Auth 凭据。如果没有,我会期待 Bearer 令牌。

在当前配置下,如果我在 postman 中使用 Basic Auth 调用资源,我可以访问数组中列出的所有资源以及来自 anyExchange 方法的资源。另外,如果我在浏览器中输入资源,登录表单不会弹出。

有人知道如何为不同的资源支持这两种策略吗?谢谢。

更新 1(建议失败)

我尝试了此 中的建议,但没有成功。

我使用 Okta 作为 OAuth IDP 创建了一个简单的 example

在使用带有 Order 注释的不同 Bean 的情况下,我无法做到这一点 运行,总是获得 403 状态,如果访问一个假设是基本身份验证,它也会要求Okta 身份验证。

至少只有一个 Bean 配置,我设法从 secureoauth 端点看到答案,而 securebasic 端点​​由于访问策略而被拒绝。

在这两种情况下,总是调用 OAuth 身份验证。

更新 2(建议成功)

感谢@greiker 的建议,他在我的示例中添加了一个 PR,您可以在其中找到它 here

在拉取请求中,您可以找到我的一些审查意见,这些意见将针对 Okta 用例实施,并推动让人们在需要时进行检查,但是建议的更改不会被删除,因为它们涵盖了更广泛的用例.

假设显示的代码来自 @Configuration class。您可以将您的配置拆分为多个 classes 并在配置基本身份验证的第一个位置添加 @Order(1)(最终为这些路径添加 permitAll)并拒绝 OAuth URL 的连接

然后 @Order(2) 在您配置 OAuth 路径的第二个位置。

将两者混合在同一个文件中只会让你头疼,但我相信可以通过 AuthenticationEntryPoint 来完成。