使用用户 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 中处理用户的取消

我们如何在 Keycloak 授权服务策略中为所有用户分配权限?

是否可以在 keycloak 中为不同组中的用户添加不同的角色?