使用用户 SPI 在 Keycloak 中为外部用户分配角色
Posted
技术标签:
【中文标题】使用用户 SPI 在 Keycloak 中为外部用户分配角色【英文标题】:Assigning Roles to external User in Keycloak Using User SPI 【发布时间】:2021-10-09 10:47:09 【问题描述】:我已经使用官方文档中给出的 Spring Boot 示例在 Keycloak 中实现了用户存储 SPI。对于外部数据存储,我使用了 Sql Server。 Keycloak 用户 SPI 可以很好地验证 Sql Server 中存在的用户,我可以使用 Keycloak REST API 成功获取访问令牌。
现在我想为外部用户分配一个 keycloak 角色,但我不知道该怎么做。
如果需要有关该问题的更多详细信息,请随时提出。
这是我注册的用户联盟详细信息:
用户联盟:
注意:在使用 keycloak User SPI 登录过程中,这些函数被调用 getUserById() & getUserByEmail()/getUserByUserName()
【问题讨论】:
你试过了吗?如果你的 SPI 像你说的那样工作,Keycloak 应该为你处理映射。根本不需要实现任何东西。 是的,SPI 也在工作并验证用户,但没有将用户保存在 keycloak 内的用户存储中,我已经浏览了 2.3 次用户 SPI 文档,但找不到任何相关信息。 你在Keycloak的“用户”下看到用户还是认证成功后用户不见了?如果是这样,您缺少实现细节。你实现UserStorageProvider
了吗?
【参考方案1】:
Keycloak 将您的用户数据存储在 FED_* 表下。如果您想映射角色,您可以覆盖将由您的 UserAdapter (AbstractUserAdapterFederatedStorage) 中的 keycloak 调用的方法:
override fun getRoleMappingsInternal(): MutableSet<RoleModel>
val roles = mutableSetOf<RoleModel>()
val myProviderRoles: List<String> = user.roles
for (it in myProviderRoles)
realm.getClientsStream(-1, -1).forEach client ->
val role = client.getRole(it)
if (role != null) roles += role
return roles
然后,当您创建适配器时,填写您想要的角色:
override fun createAdapter(myUser: MyUser, session: KeycloakSession, realm: RealmModel, model: UserStorageProviderModel): UserModel
myUser.roles = repositoryRoles.getUserRoles(myUser.id).map it.name
return UserAdapter(myUser, session, realm, model)
【讨论】:
以上是关于使用用户 SPI 在 Keycloak 中为外部用户分配角色的主要内容,如果未能解决你的问题,请参考以下文章
带有外部 Jar 的 Keycloak 自定义 SPI 部署
如果为用户存储 SPI 选择“NO_CACHE”缓存策略,KeyCloak 7.0.0 会抛出 NullPointerException
在 Keycloak SPI/Provider 中获取当前用户访问令牌(初始登录时)
在自定义 Keycloak SPI Authenticator 中处理用户的取消