【问题标题】:JHipster - OAuth2/OIDC need to read groups from access tokenJHipster - OAuth2/OIDC 需要从访问令牌中读取组
【发布时间】:2021-07-04 07:29:38
【问题描述】:

JHipster OAuth2/OIDC 默认配置期望在 idToken 中找到“组”。谁能解释如何从访问令牌中读取“组”?

【问题讨论】:

  • 我正在使用 Okta 进行测试,并且我已配置授权服务器以将“组”声明添加到访问令牌。生产部署将使用不同的身份提供者,该身份提供者要求“组”位于访问令牌中,我无法在我的开发环境中针对该提供者进行测试。
  • 好的,我添加了 okta 标签以便你得到他们的关注
  • Spring Security 默认从 ID 令牌中读取。也许有办法改变它?我不确定。这是groups 声明映射到当局的地方。 github.com/jhipster/generator-jhipster/blob/main/generators/…
  • 注意:如果您使用 JHipster 作为资源服务器,并在其中传入访问令牌,则会调用 JwtDecoder bean 并执行组映射。

标签: spring-security oauth-2.0 jhipster okta


【解决方案1】:

以下是从访问令牌中检索用户组/授予权限的更改。

请注意,在我的情况下,交换身份验证代码的访问令牌 (JSON) 包含一个“access_token”字段作为 idToken 的对等方。 “access_token”字段是一个 ID 或对用户组的实际访问令牌的引用。需要额外的 http 请求来检索“实际”访问令牌。

对于 Okta,访问令牌是类似于 idToken 的 JWT,因此如果由于某种原因您需要配置 Okta 以将组添加到访问令牌而不是 idToken,您会在那里找到它们。

解决方案基于此 Spring 文档:

Delegation-based strategy with OAuth2UserService

在您的 WebSecurityConfigurerAdapter 类中编辑您的 oauth2Login 配置:

.oauth2Login().userInfoEndpoint().oidcUserService(this.oidcUserService());

然后创建自定义的oidcUserService():

private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
    final OidcUserService delegate = new OidcUserService();
    return (userRequest) -> {
        // Delegate to the default implementation for loading a user
        OidcUser oidcUser = delegate.loadUser(userRequest);

        // The access token will be a reference to the actual token
        // ( for Okta this would be the actual JWT access token )
        String accessTokenRef = userRequest.getAccessToken().getTokenValue();

        // Call the end point to get the actual access_token
        // ( httpClient is just a RestTemplate impl w/the required configs )
        String[] groups = httpClient.fetchGroups(accessTokenRef);

        // Create the GrantedAuthority objs & add to mappedAuthorities set
        Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
        for (String group: groups) {
            mappedAuthorities.add(new SimpleGrantedAuthority(group));
        }

        // Create a copy of oidcUser but use the mappedAuthorities instead
        oidcUser = new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo());
        return oidcUser;
    };
}

如果您使用 JHipster,则需要更新 GrantedAuthoritiesMapper,以将传入的权限直接映射到您的应用程序角色,而不是从 idToken 中读取它们。比如:

@Bean
public GrantedAuthoritiesMapper userAuthoritiesMapper() {
    return (authorities) -> {
        Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
        Collection<String> roles = new HashSet();
        authorities.forEach(authority -> {
            roles.add(authority.getAuthority());
        });
        List<GrantedAuthority> list = SecurityUtils.mapRolesToGrantedAuthorities(roles);
        mappedAuthorities = new HashSet<GrantedAuthority>(list);
        return mappedAuthorities;
    };
}

可能还有其他方法可以做到这一点,我很乐意听取任何建议。
感谢评论者的帮助。

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 1970-01-01
    • 2019-02-01
    • 2022-12-15
    • 2018-12-30
    • 1970-01-01
    • 2023-04-05
    • 2018-10-26
    • 2021-11-14
    相关资源
    最近更新 更多