【发布时间】:2021-10-08 05:15:35
【问题描述】:
我正在尝试进行安全 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()
检查 noAuthPaths 和 basicAuthPaths 是否只是字符串模式的数组,最后一个数组(basicAuthPaths) 是我想要的使用 HttpBasic。
如果我在浏览器中调用资源,并且它在 basicAuthPaths 中列出,我希望登录弹出请求基本身份验证凭据。如果不是,我会期待 Bearer 令牌。
使用当前配置,如果我在邮递员中使用基本身份验证调用资源,我可以访问数组中列出的所有资源以及来自 anyExchange 方法的资源。此外,如果我在浏览器中输入资源,登录表单也不会弹出。
有人知道如何支持不同资源的这两种策略吗?谢谢。
更新 1(建议失败)
我尝试了answer 中的建议,但没有成功。
我使用 Okta 作为 OAuth IDP 创建了一个简单的 example。
在使用带有 Order 注释的不同 Bean 的情况下,我无法使其运行,总是获得 403 状态,如果假设访问该 Bean 是基本身份验证,它还要求进行 Okta 身份验证。
至少只有一个 Bean 配置,我设法从 secureoauth 端点看到答案,并且由于访问策略,securebasic 端点拒绝。
在这两种情况下,总是调用 OAuth 身份验证。
更新 2(成功建议)
感谢@greiker 的建议,他在我的示例中添加了一个 PR,您可以在其中找到它 here
在拉取请求中,您可以找到我的一些评论 cmets,它们将为 Okta 用例实施并推送以让人们在需要时进行检查,但建议的更改不会被删除,因为它们涵盖了更广泛的案例。
【问题讨论】:
标签: spring security spring-webflux basic-authentication spring-security-oauth2