使用 Okta Spring Boot Starter 的自定义权限

Posted

技术标签:

【中文标题】使用 Okta Spring Boot Starter 的自定义权限【英文标题】:Use custom authorities with 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 实现它吗?

【问题讨论】:

【参考方案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的原生支持。

【讨论】:

以上是关于使用 Okta Spring Boot Starter 的自定义权限的主要内容,如果未能解决你的问题,请参考以下文章

Okta/Spring Boot Saml 应用程序进入无限循环

覆盖/绕过 Spring Boot 默认登录页面到 okta OIDC 登录页面

在 Spring Boot 应用程序上添加 jpa 依赖项时,Okta Spring Boot 不起作用

使用 Okta Spring Boot Starter 的自定义权限

我应该遵循哪个指南来构建应用程序:Spring Boot (REST)+React+OKTA

通过 Okta 进行身份验证后,会话 cookie 不会发送到 Spring Boot 应用程序