当前位置: 首页 > 知识库问答 >
问题:

KeyCloak:将ldap组映射到springboot角色

轩辕成天
2023-03-14

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

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

  1. 在Users Federation菜单中使用ldap创建用户Federation(无需导入)。检查是否可以在用户菜单中找到ldap用户。
  2. 添加group-ldap-mapper https://prnt.sc/12fb6b8检查组菜单中的ldap组是否可见。此外,用户具有正确的组成员身份:https://prnt.sc/12fb9xr
  3. 在客户端中为我的应用程序创建客户端。
  4. 在客户端中创建两个角色-管理员和用户:https://prnt.sc/12fbbut
  5. 在组-管理员(ldap组)-角色映射中添加管理客户端角色:http://prntscr.com/12fbhbq。现在我的用户菜单中的用户有了正确的有效角色,包括管理员和用户:https://prnt.sc/12fc7j2

现在,我在浏览器中访问客户机应用程序,并将其重定向到keycloak,在那里我使用ldap用户密码进行身份验证。
我希望经过身份验证的用户在应用程序中具有管理员角色。但实际上它只有标准的keycloak角色,而不是在客户机中创建的自定义角色:https://prnt.sc/12fc3fx Controller methods with@preauthorize(“hasrole('admin')”)响应403。

UPD:

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

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

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

共有1个答案

漆雕疏珂
2023-03-14

结果,我错过了keycloak.use-resource-role-mappings:true在application.yml中。

来自医生:

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

 类似资料:
  • 我有一个用KeyCloak保护的spring boot应用程序。领域中的每个用户都有我的资源(客户机)的角色。角色配置在用户选项卡上,对于角色映射选项卡下的特定用户,角色配置为客户端角色: 我还使用了与LDAP Active Directory的集成,所有用户都来自LDAP Active Directory。现在,如果我想为Active Directory(AD)组添加特定的角色,我必须进入Act

  • 在我的服务器中。xml我有以下配置: 认证后我的主题是这样的: 组 ID 是由我的自定义登录模块设置的,因为 ldap 注册表中的组在具有成员的属性中没有条目,因此不是由标准 Liberty 登录模块设置的。因此,在我的自定义模块中,我在LDAP中搜索用户,并将条目的组添加到私有凭据的groupIds数组中: 我还需要做些什么吗?或者只需要将组的字符串添加到数组中就足够了? 我还尝试使用secur

  • 我有自由配置文件身份验证与MS活动目录。但是我无法设置到组的角色映射。 我已在web.xml中创建了安全角色: 我用wmm将角色映射到ibm-application-bnd.xml中的一个组,该组工作: 但这并不适用于自由档案 我需要更改访问id吗?

  • 我试图使用KeyCloak的管理API,以便向用户角色映射添加客户端级别的角色。为此,我使用管理endpoint: 不确定这里的问题是什么,因为该角色存在于系统中。这里会出什么问题?

  • 我正在尝试将yml文件映射到Spring boot应用程序中具有字符串键和PromotionPolicy值的HashMap,并使用默认的Spring boot实现来解析这些值,但当我尝试从映射中读取值时,PromotionPolicy对象只包含所有实例的默认值[0,false,false]。 我的yml是: 我拥有的模型是: 组件java类如下: 尝试在此处显示值: 我的输出如下: 而我希望结果包

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?