gpt4 book ai didi

spring - 在 keycloak 和 spring rest api 中管理用户权限

转载 作者:行者123 更新时间:2023-12-04 02:46:31 29 4
gpt4 key购买 nike

TL;DR

  • Objective: managing api permissions:
    • OIDC authorization direct grant flow
    • User federation and authentication source : LDAP
    • Permissions store : legacy database
    • Client management and authentication: Keycloak
  • Question: What are the best practices for managing user permissions on Keycloak and rest api?


语境

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

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

现在我们必须管理用户权限如下:
  • 客户端应用程序应该知道显示/隐藏功能的用户权限
  • api 应该能够验证用户权限以使用不同的端点
  • 用户权限基于数据库中的一些规则,并且经常变化

  • 在我的理解中,keycloak 可以使用硬编码或基于用户的策略处理授权和细粒度的权限,但不能本地插入到不同的授权源。因此,我想到使用 构建自定义角色映射器。 key 斗篷 SPI ,从我将开发的自定义 api 中检索用户权限,然后将它们映射到访问 token 。

    因此,我的访问 token 应如下所示:
    "resource_access": {
    “My-client”: {
    “permissions”: [
    “Show-products”,
    “Buy-something”,
    “Display-prices”
    ]
    }
    },
    "username": “myUser”

    然后移动应用程序应该能够根据 token 知道用户权限,我的无状态服务器端 (API) 应该能够在每次调用时访问用户权限以使用 spring 注释检查它们:
    @PreAuthorize("hasRole('Show-products')")

    问题

    在第一次试验后,我的解决方案似乎工作正常,但我仍然对这个选择有一些安全问题,因为它超出了 keycloak 标准,并且在 keycloak 映射器中包含对不同后端的 rest 调用。

    所以我想知道:
  • 将用户权限置于访问 token 声明上是否安全?
  • 如何保护对外部系统(休息调用)的 key 斗篷访问
    找回权限?
  • 我应该依靠 token 声明来验证每个用户的权限吗?
    在我的资源服务器中请求?
  • 是否有任何其他干净的解决方案/最佳实践来处理用户
    来自 keycloak 中外部源的权限?

  • 免费信息

    我正在使用 :
  • Springboot 1.5.13.RELEASE
  • Keycloak-adapter-bom 3.4.3.Final
  • 独立 key 斗篷服务器 3.4.3.Final
  • 最佳答案

    关于您的问题:

    - 将用户权限置于访问 token 声明上是否安全?

    是的,功能可以(并且应该)在访问 token 上,因此您可以在业务层(基于角色/访问声明)做出一些决定。但是请记住, token 仅采用 base 64 编码,并且可以被其他人复制并查看,因此它不应包含 secret 或特别 secret 的信息,通常您会在那里放置足够的关于用户的信息,以及其当前的一些权限/能力/ claim 。

    如何保护 key 斗篷对外部系统的访问(休息调用)以检索权限?

    这取决于它是否需要从您的网络外部访问。如果没有,您可以让它不 protected (并且从外部不可用/或仅可用于某些特定 IP)。如果它可以从外部获得/或者无论如何你想用 keycloack 保护它,你可以拥有“ secret ”或“仅限承载”类型的客户端。我建议您研究 CORS 和 token 共享,以便您可以将已创建的“访问 token ”用于其他端点,而无需再次进行身份验证。

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

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

    在 oAuth2 中,“资源服务器”有 2 个职责:1-提供资源和 2-执行额外的授权步骤。在 keycloak 世界中,这两个步骤由不同的参与者完成。第 1 步由您的应用程序完成,而第 2 步仅在 keycloak 激活策略执行时才完成(这意味着 Keycloak 是身份验证服务器,并且从 oAuth2 的角度来看也是“资源服务器”的一部分)

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

    是否有任何其他干净的解决方案/最佳实践来处理 keycloak 中来自外部来源的用户权限?

    很难说,你可能已经注意到了;网络中针对您的特定用例的文档非常有限;所以那里没有很多最佳实践的工作,你唯一真正的选择是使用带有自定义策略 SPI 的策略,这会带来其他挑战。我会说你的解决方案很好。

    此致。

    关于spring - 在 keycloak 和 spring rest api 中管理用户权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50672115/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com