首页 > 解决方案 > 使用用户 SPI 在 Keycloak 中为外部用户分配角色

问题描述

我已经使用官方文档中给出的 Spring Boot 示例在 Keycloak 中实现了用户存储 SPI。对于外部数据存储,我使用了 Sql Server。Keycloak 用户 SPI 可以很好地验证 Sql Server 中存在的用户,我可以使用 Keycloak REST API 成功获取访问令牌。

现在我想为外部用户分配一个 keycloak 角色,但我不知道该怎么做。

如果需要有关该问题的更多详细信息,请随时提问。

这是我注册的用户联盟详细信息:

用户联盟:

用户联盟

注意:在使用 keycloak User SPI 登录过程中,这些函数被调用 getUserById() & getUserByEmail()/getUserByUserName()

标签: javaspringspring-bootkeycloakkeycloak-services

解决方案


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)
}

推荐阅读