使用 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 的自定义权限