【发布时间】:2018-11-13 06:56:34
【问题描述】:
TL;DR
- 目的:管理api权限:
- OIDC 授权直接授权流程
- 用户联合和身份验证源:LDAP
- 权限存储:旧数据库
- 客户端管理和身份验证:Keycloak
- 问题:在 Keycloak 和 rest api 上管理用户权限的最佳做法是什么?
上下文
我们正在实现一个带有 spring 的 rest API,供移动应用程序和 SPA 使用。我们的用户帐户、权限、规则……以及所有数据都存储在一个自定义数据库中,供不同的单体应用程序使用。为了保护我们的 API,我们决定使用 Keycloak。
keycloak 服务器配置了用于用户联合的现有 LDAP 和用于移动客户端应用程序的“Direct grand flow”。对于第一个用例(身份验证),一切正常。
现在我们必须按如下方式管理用户权限:
客户端应用程序应该知道用户显示/隐藏功能的权限
api 应该能够验证用户使用不同端点的权限
用户权限是基于数据库中的一些规则,经常变化
据我了解,keycloak 可以使用硬编码或基于用户的策略来处理授权和细粒度权限,但不能以原生方式插入不同的授权源。因此,我想到了使用 Keycloak SPI 构建自定义角色映射器,从我将开发的自定义 api 中检索用户权限,然后将它们映射到访问令牌。
因此,我的访问令牌应如下所示:
"resource_access": {
“My-client”: {
“permissions”: [
“Show-products”,
“Buy-something”,
“Display-prices”
]
}
},
"username": “myUser”
然后移动应用程序应该能够根据令牌知道用户权限,并且我的无状态服务器端(API)应该能够在每次调用时访问用户权限以使用 spring 注释检查它们:
@PreAuthorize("hasRole('Show-products')")
问题
在第一次尝试后,我的解决方案似乎运行良好,但我仍然对这个选择存在一些安全问题,因为它不符合 keycloak 标准,并且在 keycloak 映射器中包含对不同后端的休息调用。
所以我想知道:
- 将用户权限放在访问令牌声明上是否安全?
- 如何保护对外部系统的 keycloak 访问(休息调用)以 检索权限?
- 我是否应该依靠令牌声明来验证每个用户的权限? 在我的资源服务器中请求?
- 是否有任何其他干净的解决方案/最佳实践来处理用户 在 keycloak 中来自外部源的权限?
免费信息
我正在使用:
- Springboot 1.5.13.RELEASE
- Keycloak-adapter-bom 3.4.3.Final
- 独立 keycloak 服务器 3.4.3.Final
【问题讨论】:
-
嗨@wadi3,你实现了吗?
标签: spring rest spring-security keycloak openid-connect