【问题标题】:Use custom authorities with Okta Spring Boot Starter使用 Okta Spring Boot Starter 的自定义权限
【发布时间】:2020-10-19 11:25:12
【问题描述】:

我正在使用 Okta Spring Boot Starter 的版本 1.4.0 来验证传入的 JWT 令牌。通过使用 Starter,身份验证和授权都可以开箱即用(默认设置非常好,您甚至不需要在自己的安全配置中定义任何内容)。

但是我不喜欢默认创建的角色,所以我想将传入的范围和角色映射到我自己定义的 Spring 权限。当使用普通的 OAuth 启动器时,可以定义一个 AuthoritiesExtractor bean 来执行 just

@Bean
public AuthoritiesExtractor authoritiesExtractor() {
  return new YourOwnAuthoritiesExtractor();
}

除此之外,还可以选择在您的安全配置中实现自定义jwtAuthenticationConverter

http
  ..
  .oauth2ResourceServer()
  .jwt(jwt -> jwt.jwtAuthenticationConverter(new JwtAuthenticationConverter() {

    @Override
    protected Collection<GrantedAuthority> extractAuthorities(final Jwt jwt) {
      // implementation
    }
  
  })

但是所有这些东西似乎都不适用于 Okta Starter,因为当 JWT 令牌发送到服务器时,提取器永远不会被调用。有人知道如何为 Okta 实现它吗?

【问题讨论】:

    标签: spring-security okta


    【解决方案1】:

    TL;DR
    目前,标准的 Okta Starter 无法实现。

    说明
    由于 Okta 使用自己的配置器来设置 oauth2ResourceServer,因此您不能使用自定义 JwtAuthenticationConverter,因为它将被 Okta defines 覆盖。您也不能使用 AuthoritiesExtractor,因为该接口甚至没有与 Okta Starter 一起打包。

    为了克服这个问题,Okta 引入了AuthoritiesProvider 接口的概念。通过定义自定义 bean,您可以将自己的权限添加到 Okta 已设置的权限:

    @Bean
    AuthoritiesProvider myCustomAuthoritiesProvider() {
      return (user, userRequest) -> lookupExtraAuthoritesByName(user.getAttributes().get("email"));
    }
    

    很遗憾,AuthoritiesProvider 接口只支持授权代码流,不支持资源服务器。只要#160没有被解析,就不会有Opaque和JWT的原生支持。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2020-02-25
      • 1970-01-01
      • 2020-09-29
      • 2019-10-28
      • 2014-04-07
      • 2021-11-26
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多