java - 使用用户 SPI 在 Keycloak 中为外部用户分配角色
问题描述
我已经使用官方文档中给出的 Spring Boot 示例在 Keycloak 中实现了用户存储 SPI。对于外部数据存储,我使用了 Sql Server。Keycloak 用户 SPI 可以很好地验证 Sql Server 中存在的用户,我可以使用 Keycloak REST API 成功获取访问令牌。
现在我想为外部用户分配一个 keycloak 角色,但我不知道该怎么做。
如果需要有关该问题的更多详细信息,请随时提问。
这是我注册的用户联盟详细信息:
用户联盟:
注意:在使用 keycloak User SPI 登录过程中,这些函数被调用 getUserById() & getUserByEmail()/getUserByUserName()
解决方案
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)
}
推荐阅读
- flutter - Flutter:架构 arm64 的未定义符号
- javascript - 没有选项进入动态填充的选择标签
- javascript - PostgreSQL:从 CSV 文件读取数据时出现 INSERT 错误
- performance - 如果来源太多,预连接来源的顺序是否重要
- angular - 当有待处理的请求时,我的应用程序卡住了
- c# - 20 倍的性能差异 Interlocked.Read 与 Interlocked.CompareExchange 虽然都使用 lock cmpxchg 实现
- python - python(烧瓶)中的给定模块错误中没有名称
- linux - 对于给定条件,使用 AWK 将一个文件中的列添加到另一个文件中
- linux - 如何解决无法解析“proxy.iiit.ac.in”
- java - 更改输入日期的日期格式并仅传递给函数实际日期