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

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

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

  1. 在用户联盟菜单中使用 ldap 创建用户联盟(不导入)。检查是否可以在用户菜单中找到 ldap 用户。
  2. 添加 group-ldap-mapper https://prnt.sc/12fb6b8 检查 ldap 组在组菜单中是否可见。用户也有正确的组成员身份:https://prnt.sc/12fb9xr
  3. 在客户端中为我的应用程序创建客户端。
  4. 在客户端创建两个角色 - ADMIN 和 USER:https://prnt.sc/12fbbut
  5. 在组 - 管理员(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 客户端应用程序有问题?

【问题讨论】:

标签: spring-boot keycloak


【解决方案1】:

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

来自doc

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

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

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2017-07-27
    • 2020-03-16
    • 1970-01-01
    • 2016-05-16
    • 2022-12-28
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多