【问题标题】:Spring security reactive mixing HttpBasic + Oauth2Spring 安全响应式混合 HttpBasic + Oauth2
【发布时间】: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()

检查 noAuthPathsbasicAuthPaths 是否只是字符串模式的数组,最后一个数组(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


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我有常规的网络安全,那将是真的,但这是反应式编程,所以安全配置有点不同。您能否详细说明 AuthenticationEntryPoint 建议?
    • 没有区别,你复制一份,你下单。
    • 我一直在尝试按照您的建议进行操作,但没有成功。我使用 Okta 作为 OAuth IDP (github.com/dbranco/howto-security) 创建了一个简单的测试。在使用带有 Order 注释的不同 Bean 的情况下,我无法使其运行,总是获得 403 状态,如果假设访问该 Bean 是基本身份验证,它还要求进行 Okta 身份验证。至少只有一个 Bean 配置,我设法从 secureoauth 端点看到答案,并且由于访问策略,securebasic 端点​​拒绝。在这两种情况下,总是调用 OAuth 身份验证
    • 我不确定多个带有 Order 的 Bean 是否会起作用,我想到了带有 @Order 的多个类(尽管它可能会起作用)。在任何情况下,您都需要允许所有其他 URL,以便您只获得一次身份验证检查。我也认为 jwt 的属性不正确。应该是spring.security.oauth2.provider.okta.issuer-urispring.security.oauth2.registration.okta.client-id 等......这可能就是你得到403的原因
    • 我已经在你的代码中添加了一个 Pull Request github.com/dbranco/howto-security/pull/1 技巧是你需要一个 securityMatcher 来进行响应式配置
    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2017-10-01
    • 2020-03-25
    • 2017-08-06
    • 2020-07-02
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多