gpt4 book ai didi

java - 如何从外部 IDP 读取/导入角色到 Keycloak

转载 作者:行者123 更新时间:2023-12-05 03:47:59 24 4
gpt4 key购买 nike

我有一个使用 Keycloak 11.0.2 保护的 spring boot 应用程序,我的 Keycloak 设置如下:

  • 一个名为Central 的领域,具有角色CentralWebUser 和一个客户端SpringWeb。客户有
    • 访问类型:public 并且只启用一个流,即Standard Flow Enabled
    • 有效的重定向 URI : http://localhost:8000/*
  • 名为 SpringApp 的 2ª 领域,具有角色 WebUser 和客户端 spring_brokering
    • 名为 springuser 的用户,具有领域角色 WebUser
    • 客户端 spring_brokering 仅将 Standard Flow Enabled 设置为 ON,Valid Redirect URIs :http://localhost:8080/*和访问类型: secret

第二个领域是第一个领域的 IDP。因此,要登录用户,请转到 Central 登录页面并选择 IDP SpringAppIDP

IDP配置如下:

在 Spring 方面,我有以下值得一提的属性:

server.port                         = 8000
keycloak.realm = Central
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = SpringWeb
keycloak.public-client=true

keycloak.security-constraints[0].authRoles[0]=WebUser
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/services/*

当我访问 http://127.0.0.1:8080/services 时,我被重定向到 Keycloak Central 领域登录页面,然后我单击 SpringAppIDP 并输入用户名 springuser 及其密码。登录成功,但是我得到了一个access denied,这意味着用户springuser没有角色WebUser。但是,该角色已分配给第二个领域内的该用户( SpringApp)。

有趣的是,如果在第一个领域中我创建了一个身份提供者映射器 External Role to Role(在 IDP SpringAppIDP 配置中)映射 WebUser 的外部角色CentralWebUser 并将 spring 属性更改为:

keycloak.security-constraints[0].authRoles[0]=CentralWebUser
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/services/*

我能够登录,这意味着 Keycloak 知道用户具有 WebUser 角色,因此将该角色映射到 CentralWebUser 角色。

我想知道是否可以将角色从外部 IDP 显式导入到内部 IDP?或者,如果(以及如何)我可以代表用户请求一个 token ,该 token 将从该 token 中的 CentralSpringWeb 领域拥有该用户的角色,而无需必须为每个用户角色显式创建角色映射器。

最佳答案

I would like to know if it is possible to explicitly import the rolesfrom an external IDP into an internal one? Or if (and how) can Irequest a token in behalf to the user that would have that users'roles from both the Central and SpringWeb Realm in the that token,without having to explicitly creating a Role Mapper for each userrole.

在没有为每个用户角色显式创建角色映射器的情况下,我找到的唯一解决方案是扩展 Keycloak 代码;这带来了明显的缺点。

回想起来,Keycloak 没有提供一种开箱即用的方法来自动从外部 IDP 导入所有角色,这实际上是有道理的。例如,如果我将 Google 用作外部 IDP,为什么我的内部 IDP(,Keycloak)要关心 Google 使用的角色的确切名称?!。最有可能的是,这些角色对内部 IDP 来说毫无意义,而当它们有意义时,它们可能有不同的名称。无论如何,对于这些异常,可以使用 Role Mapper 功能。

尽管如此,为了稍微自动化该过程,我创建了一个文件,将内部 IDP 的角色映射到外部 IDP,例如:

ROLE A | ROLE B
....

我还有一个 JSON 文件,其中包含一个角色映射器示例的模板,其中有一些标记随后会被替换(例如,字段 roleexternal.role)。

使用脚本,我读取具有角色之间映射的文件,并使用 Keycloak Admin REST API创建角色、映射器等。

我使用的逻辑如下:

  • 如果角色在外部 IDP 中不存在,我就跳过并假设这是一个错误;
  • 如果该角色在内部 IDP 中不存在,我将其创建为领域角色;为此,我使用端点 POST/{realm}/roles
  • 最后,我使用包含 JSON 内容的端点 POST/{realm}/identity-provider/instances/{alias}/mappers 创建角色映射器模板角色映射文件(相应地替换了它的标签)。

不在外部 IDP 中创建领域角色的理由是,无论如何,外部 IDP 中的所有角色都应该已经从 LDAP 加载。对于内部 IDP,我确实创建了,因为对于映射 1 到 1,来自 LDAP(加载到外部 IDP)的角色尚未创建是可以预期的内部 IDP。

关于java - 如何从外部 IDP 读取/导入角色到 Keycloak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64634250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com