Keycloak:将 ldap 组映射到 springboot 角色

Keycloak: map ldap groups to springboot roles

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

我在 Keycloak 管理控制台中执行的步骤:

  1. 在“用户联盟”菜单中使用 ldap(无需导入)创建用户联盟。检查是否可以在“用户”菜单中找到 ldap 用户。
  2. 添加 group-ldap-mapper https://prnt.sc/12fb6b8 Check that ldap groups are visible in Groups menu. Also users have correct group membership: https://prnt.sc/12fb9xr
  3. 在客户端中为我的应用程序创建客户端。
  4. 在客户端创建两个角色 - ADMIN 和 USER:https://prnt.sc/12fbbut
  5. 在组-管理员(ldap 组)-角色映射中添加 ADMIN 客户端角色:http://prntscr.com/12fbhbq Do same for USER. Now my user in Users menu have correct effective roles, including ADMIN and USER: https://prnt.sc/12fc7j2

使用 KeycloakWebSecurityConfigurerAdapter 创建简单的 Spring 启动应用程序:https://pastebin.com/HsHuNn55 并且 application.yml:https://pastebin.com/JPFmwKyS

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

我错过了什么?
谢谢。 Keycloak 12.0.3,Spring 启动 2.4.2


更新:

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

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

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

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

来自doc

use-resource-role-mappings
If set to true, the adapter will look inside the token for application level role mappings for the user. If false, it will look at the realm level for user role mappings. This is OPTIONAL. The default value is false.

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