Keycloak:将 ldap 组映射到 springboot 角色

Posted

技术标签:

【中文标题】Keycloak:将 ldap 组映射到 springboot 角色【英文标题】:Keycloak: map ldap groups to springboot roles 【发布时间】:2021-07-25 21:42:43 【问题描述】:

我们公司的用户存储在 ldap(oracle 互联网目录)中。用户具有某些组,例如管理员、用户等 我需要将这些组映射到我的客户端应用程序角色。客户端应用程序是使用 keycloak-spring-security-adapter (pom) 测试 Spring Boot 应用程序。

我在 Keycloak 管理控制台中所做的步骤:

    在用户联盟菜单中使用 ldap 创建用户联盟(不导入)。检查是否可以在用户菜单中找到 ldap 用户。 添加 group-ldap-mapper https://prnt.sc/12fb6b8 检查 ldap 组在组菜单中是否可见。用户也有正确的组成员身份:https://prnt.sc/12fb9xr 在客户端中为我的应用程序创建客户端。 在客户端创建两个角色 - ADMIN 和 USER:https://prnt.sc/12fbbut 在组 - 管理员(ldap 组) - 角色映射中添加 ADMIN 客户端角色:http://prntscr.com/12fbhbq 对 USER 执行相同操作。现在我在用户菜单中的用户具有正确的有效角色,包括 ADMIN 和 USER:https://prnt.sc/12fc7j2

使用 KeycloakWebSecurityConfigurerAdapter 创建简单的 Spring Boot 应用程序:https://pastebin.com/HsHuNn55 和application.yml:https://pastebin.com/JPFmwKyS

现在我在浏览器中访问我的客户端应用程序并被重定向到 keycloak,在那里我使用我的 ldap 用户密码进行身份验证。 我希望经过身份验证的用户在应用程序中具有 ADMIN 角色。但实际上它只有标准的 keycloak 角色,而不是我在客户端创建的自定义角色:https://prnt.sc/12fc3fx 带有 @PreAuthorize("hasRole('ADMIN')") 的控制器方法以 403 响应。

我错过了什么? 谢谢。 Keycloak 12.0.3、Spring Boot 2.4.2


更新:

我已经在我的客户端应用程序之外(使用 http 客户端)向 keycloak auth 端点发出了 http 请求,并且在收到的访问令牌中,我确实在 resource_access 部分看到了我的自定义 ADMIN 和 USER 角色:

"realm_access": 
    "roles": [
      "offline_access",
      "uma_authorization"
    ]
  ,
  "resource_access": 
    "adapter-client-test": 
      "roles": [
        "ADMIN",
        "USER"
      ]
    ,

所以我相信 keycloak 本身配置正确,但是 spring boot 客户端应用程序有问题?

【问题讨论】:

尝试在您的客户端下添加“用户客户端角色”类型的映射器。以下回答了类似的问题***.com/questions/62354754/… 【参考方案1】:

原来,我错过的一件事是 application.yml 中的 keycloak.use-resource-role-mappings: true

来自doc:

使用资源角色映射 如果设置为 true,适配器将在令牌内部查找用户的应用程序级角色映射。如果为 false,它将查看域级别的用户角色映射。这是可选的。默认值为 false。

在该应用程序经过身份验证的用户收到自定义客户端级角色之后。

【讨论】:

以上是关于Keycloak:将 ldap 组映射到 springboot 角色的主要内容,如果未能解决你的问题,请参考以下文章

我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色

如何将 LDAP AD 组映射到 python flask AppBuilder 中的用户角色

Keycloak - 将用户与 LDAP 同步的问题

Keycloak - 将所有用户映射到角色

KeyCloak 用户凭证加密

LDAP 用户组