【问题标题】:OAuth in Spring Security 5.2.x: Store userInfo responseSpring Security 5.2.x 中的 OAuth:存储 userInfo 响应
【发布时间】:2020-09-01 12:39:02
【问题描述】:

我们在 Sping Boot 2.2 上运行 API,因此使用 Sping Security 5.2。在使用 OAuth 保护此 API 时,我们使用 Spring Security 中内置的新功能(因为 Spring Security OAuth 项目现已弃用)。我们正在使用不透明的令牌,并且 (as indicated by the documentation) 具有以下形式的安全配置:

@Configuration
public static class OAuthWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests().mvcMatchers("/path/to/api/**").hasAuthority(CUSTOM_SCOPE)
            .oauth2ResourceServer().opaqueToken().introspector(opaqueTokenIntrospector());
    }
}

这里的opaqueTokenIntrospector() 是一个执行以下任务的bean:

  • 向自省端点发送请求以获取完整令牌。
  • 还向 userinfo 端点发送请求,以从 IDP 获取有关用户的其他信息。
  • 将其中一些附加信息映射到自定义 spring 角色中,并将这些角色添加到经过身份验证的用户。

按照这种配置的设置方式,对 API 的每个请求都带有两个附加请求:一个到自省端点,一个到 userinfo 端点。如果用户对 API 执行连续请求,最好节省其中一些。

是否可以将opaqueTokenIntrospector() 的结果保存在用户的会话中?这样,每个用户只需执行一次 bean 的整个流程,从而节省了冗余请求。

【问题讨论】:

    标签: spring-boot spring-security oauth-2.0


    【解决方案1】:

    当您超越基本 API 时,这是一个常见的要求。使用声明缓存解决方案,这是一种 API 网关模式:

    当第一次收到令牌时进行查找并将它们保存到一个对象中:

    • 令牌声明
    • 用户信息声明
    • 应用特定声明

    然后针对token缓存结果,以便后续使用相同token的请求速度更快:

    • 使用线程安全缓存 - 我的偏好是使用内存中的缓存
    • 使用访问令牌的 SHA256 哈希作为密钥
    • 使用序列化的声明作为值

    这可能超出了 Spring 的默认行为,但您可以自定义它。

    我有一个执行此操作的 Java 示例 - 这里有几个链接,尽管我的示例非常复杂:

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 2015-07-03
      • 2019-05-24
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2019-02-18
      • 2015-04-23
      相关资源
      最近更新 更多