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 目录将组映射到角色