在keydape和springrestapi中管理用户权限

在keydape和springrestapi中管理用户权限,spring,rest,spring-security,keycloak,openid-connect,Spring,Rest,Spring Security,Keycloak,Openid Connect,TL;DR 目标:管理api权限: OIDC授权直接授权流 用户联合和身份验证源:LDAP 权限存储:旧数据库 客户机管理和身份验证:keydrope 问题:管理keydape和restapi用户权限的最佳实践是什么? 上下文 我们正在用spring实现一个RESTAPI,供移动应用程序和SPA使用。我们的用户帐户、权限、规则……和所有数据都存储在一个自定义数据库中,由不同的单片应用程序使用。为了保护我们的api,我们决定使用KeyClope KeyClope服务器配置有用于用户联合的现

TL;DR

  • 目标:管理api权限:
    • OIDC授权直接授权流
    • 用户联合和身份验证源:LDAP
    • 权限存储:旧数据库
    • 客户机管理和身份验证:keydrope
  • 问题:管理keydape和restapi用户权限的最佳实践是什么?
上下文

我们正在用spring实现一个RESTAPI,供移动应用程序和SPA使用。我们的用户帐户、权限、规则……和所有数据都存储在一个自定义数据库中,由不同的单片应用程序使用。为了保护我们的api,我们决定使用KeyClope

KeyClope服务器配置有用于用户联合的现有LDAP和用于移动客户端应用程序的“Direct grand flow”。对于第一个用例(身份验证),一切正常

现在,我们必须按如下方式管理用户权限:

  • 客户端应用程序应该知道显示/隐藏功能的用户权限

  • api应该能够验证用户使用不同端点的权限

  • 用户权限基于数据库中的某些规则,并且经常更改

据我所知,keydape可以使用硬编码或基于用户的策略处理授权和细粒度权限,但不能以本机方式插入到不同的授权源。因此,我考虑使用keydape-SPI构建一个自定义角色映射器,从我将开发的自定义api中检索用户权限,然后将它们映射到访问令牌

因此,我的访问令牌应该如下所示:

"resource_access": {
    “My-client”: {
      “permissions”: [
        “Show-products”,
        “Buy-something”,
        “Display-prices”
      ]
    }
  },
  "username": “myUser”
然后,移动应用程序应该能够基于令牌了解用户权限,并且我的无状态服务器端(API)应该能够在每次调用时访问用户权限,以使用spring注释进行检查:

@PreAuthorize("hasRole('Show-products')")
问题

在第一次试验后,我的解决方案似乎运行良好,但我仍然对这个选择有一些安全顾虑,因为它超出了KeyClope标准,并且在KeyClope映射器中包含对不同后端的rest调用

所以我想知道:

  • 将用户权限放在访问令牌声明上是否安全
  • 如何保护对外部系统(rest调用)的KeyClope访问 检索权限
  • 我是否应该依靠令牌声明来验证每个服务器上的用户权限 我的资源服务器中的请求
  • 是否有其他干净的解决方案/最佳做法来处理用户问题 keydepeat中来自外部源的权限
免费信息

我正在使用:

  • Springboot 1.5.13.1版本
  • Keyclope适配器bom表3.4.3.1最终版本
  • 独立密钥斗篷服务器3.4.3.Final

关于您的问题:

-将用户权限放在访问令牌声明上是否安全?

是的,功能可以(也应该)在访问令牌上,通过访问令牌,您可以在业务层做出一些决策(基于角色/访问声明)。但是请记住,令牌仅采用Base64编码,其他人可以复制并查看,因此它不应包含机密或特别机密的信息,通常您会在其中输入有关用户的足够信息,以及一些当前权限/功能/声明

如何保护对外部系统(rest调用)的KeyClope访问以检索权限?

这取决于是否需要从网络外部访问它。如果没有,您可以让它不受保护(并且从外部不可用/或仅对某些特定IP可用)。如果它将从外部可用/或者您想用KeyClock保护它,您可以使用“机密”或“仅持单人”类型的客户端。我建议您研究COR和令牌共享,这样您就可以为其他端点重用已经创建的“访问令牌”,而无需再次验证

我应该依靠令牌声明来验证资源服务器中每个请求的用户权限吗?

不太清楚你的意思。在keydape中,资源服务器没有像典型的oAuth2舞蹈中那样进行额外的资源授权(除非您的策略执行器被激活,但我相信您没有采用这种方法,而是使用映射器SPI@auth server来正确设置角色?)

在oAuth2中,“资源服务器”有两个职责:1-提供资源,2-执行额外的授权步骤。在钥匙斗篷世界中,这两个步骤由不同的参与者完成。第1步由应用程序完成,第2步仅在keydove也激活策略强制时完成(这意味着keydove是身份验证服务器,也是oAuth2透视图中“资源服务器”的一部分)

现在回到您的问题,如果资源服务器只是指您的应用程序提供内容,那么是的,您可以在那里使用声明,请记住声明(以及整个访问令牌)是由身份验证服务器生成并进行数字签名的,因此您可以在应用程序中使用这些声明而不会出现问题(否则也不知道怎么做)

是否有其他干净的解决方案/最佳做法来处理KeyClope中来自外部源的用户权限?

很难说,正如您可能注意到的那样;web中针对您的特定用例的文档非常有限;因此没有太多的最佳实践工作存在,您唯一真正的选择是使用带有自定义策略SPI的策略,这会带来其他挑战。我想说您的解决方案很好


致意。

Hi@wadi3,你实施了这个吗?你能准确地说出两者之间的区别吗