对实体/资源进行 RESTful API 授权?

2023-11-27

我正在一个具有非常复杂的访问控制规则的系统中开发 API。通常需要复杂的 SQL 查询来确定用户是否具有对特定资源的读取或写入访问权限。这会导致我们的客户端应用程序变得非常复杂和冗余,因为它们必须了解所有这些规则才能确定是否向用户提供每个对象的 CRUD 选项。

我的目标是减少客户端的大部分复杂性并将所有复杂逻辑容纳在 API 中。这样,根据我们的 API 编写的新客户端应用程序可以避免在其端重新实现复杂的访问规则逻辑,同时确保 UI 只向用户提供有效选项。

我不确定处理这个问题的最佳方法是什么。我正在考虑两种不同的选项,但我不知道是否有更好或更标准的方法来向 API 的调用者公开通用访问信息。

Option 1

当调用者对资源实体或其集合发出 GET 请求时,每个返回的实体都会返回一个_allowed_actions附加字段,它是允许调用者对该实体执行的操作数组。例如,请求一个Listing对象可能会导致以下响应。

获取/列表/5

{
 "id": 5,
 "address": "123 Foo Street",
 "city": "New York",
 "state": "New York",
 "price": 457000,
 "status": "pending",
 "_allowed_actions": ["READ", "UPDATE", "DELETE"]
}

仍然不确定如何与客户端联系,他们是否有权使用此方法创建资源实体的实例,但也许客户端只需要保持对权限结构的足够理解即可自行确定这一点。创建实例的访问规则通常不如读取/更新/删除访问规则复杂,因此看起来并不算太糟糕。

Option 2

创建一个元 API,客户端可以向该 API 发出请求,以确定他们可以对每个资源执行哪些操作。例如,检查客户端可以对列表执行哪些操作:

GET /访问查询/列表/5

{
 "allowed_actions": ["READ", "UPDATE","DELETE"]
}

并检查一般列表允许哪些选项,包括创建:

GET /访问查询/列表

{
 "allowed_actions": ["READ", "CREATE", "UPDATE", "DELETE"]
}

这种方法的好处是,它允许调用者以通用方式充分了解他们可以对每个资源执行哪些操作。这样,客户就不必了解创建列表需要“create_listing”权限和非试用用户状态。他们可以简单地提前查询这些信息。

这种方法的缺点是会增加请求量。现在,他们不再需要客户端了解权限逻辑,而是必须查询一次以确定他们可以做什么,然后再进行第二次查询。

我不太喜欢这两种方法,但目前我能想到的只有这些。有更好的方法来解决这个问题吗?


您正在寻找的是细粒度的外部化授权:

  • 细粒度:您希望创建考虑多个参数或属性以及客户端(请求者)和目标实体之间可能的关系的授权策略,例如您的案例中的列表。
  • 外部化:您希望将业务逻辑与授权逻辑解耦。在你的问题中,你抱怨代码和 SQL 语句变得多么复杂。这是没有明确区分业务逻辑和授权逻辑的直接后果。

有一种称为基于属性的访问控制 (ABAC) 的模型,它定义了细粒度外部化授权的方法。 NIST(美国国家标准与技术研究所)制定了关于ABAC的报告您可以在线阅读。

OASIS(结构化信息标准推进组织)定义了一个名为XACML(可扩展访问控制标记语言)来实现ABAC。

XACML为您带来:

  • an architecture as illustrated below
    • 策略执行点 (PEP) 拦截您的 API 调用。它保护您的 API、检查消息并向策略决策点 (PDP) 发送授权请求。
    • The policy decision point (PDP) evaluates incoming authorization requests from the PEP against a set of authorization policies written in XACML. The PDP eventually reaches a Permit or Deny decision. To reach decisions it may need to look up additional attribute values from databases, web services, LDAP, or files. These are called policy information points in the architecture. XACML Architecture Flow
  • a policy language: the XACML policy language is attribute-based which means it uses attributes to define what can be allowed and what is not. For instance, you could define rules such as:
    • 当且仅当房源位置 == 代理位置时,房地产经纪人才能看到所有房源
    • 当且仅当房地产经纪人拥有该列表时,他/她才可以编辑该列表
    • 当且仅当列表中的物品已售出且当且仅当经纪人是出售该物品的人时,房地产经纪人才可以关闭列表。
  • a request/response scheme: XACML also defines a way to query the PDP and to get responses back. A PDP can be queried either via single questions or via multiple questions in a single request e.g.:
    • Alice 可以查看清单 123 吗?是的,允许。
    • Alice 可以查看、编辑或删除列表 123 吗?允许;否定;否定。

通过基于 XACML 的方法,您可以将业务逻辑和 API 与授权逻辑分开来维护。这样做有几个好处:

  1. 您始终可以重新实现 API 并保持相同的授权模型
  2. 您可以轻松扩展您的API,而无需重写授权
  3. 您可以独立于代码更改授权逻辑
  4. 您可以更轻松地审核您的授权逻辑
  5. 您的授权逻辑是技术中立的。它适用于 REST API、Web 服务、数据库等

我建议您查看以下资源:

  1. the OASIS XACML 网站
  2. the Eclipse 的 ALFA 插件- 编写 XACML 策略的免费工具。
  3. The XACML 开发者社区

XACML 有供应商和开源实现:

  • Axiomatics 是一个提供 .NET 和 Java XACML 实现的供应商解决方案
  • SunXACML 是一个长期存在的开源 Java XACML 实现

哈特哈, 大卫。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对实体/资源进行 RESTful API 授权? 的相关文章

  • Spring Security 层次结构角色系统

    我希望你帮助构建一个认为相当复杂的安全环境 我想知道我是否只能使用 spring 层次结构角色系统甚至 spring ACL 我需要构建一个具有很多角色的安全环境 例如 1 级 第 1 组 第 2 组 2 级 公司 1 公司 2 等级 3
  • 如何向最终用户隐藏 REST API Url?

    是否可以隐藏我通过 AJAX 用于填充页面数据的 REST URL 我不希望其他人从我的 REST API 获取和使用 但需要使用它在我的网站中显示内容 如何向最终用户隐藏我的 REST API URL 无法在 JavaScript 中向最
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 如何进行 REST 式更新?

    如果我有一个对象 请说Employee 我想提供两种不同的更新方式 更新绩效评级或更新联系信息 构建 API 的 REST 式方式是什么 我认为正确的方法是 POST 我担心的是 对于用户来说 首先获取对象的两个部分 绩效评级和联系信息 仅
  • 从 Office 365 日历获取所有事件

    我需要获取 Office 365 日历中的所有事件 当前 GET 请求 https graph microsoft com v1 0 users https graph microsoft com v1 0 users userPrinci
  • ASP.Net MVC 4 通用主要难点

    我正在开发一个ASP NET MVC 4Web应用程序 以前我的 MVC 应用程序是使用MVC 3和这个新的MVC 4我刚刚复制 重复使用了我的应用程序认证和授权码从以前的应用程序 当用户登录我的网站时 我会执行以下操作 账户控制器 pub
  • Azure API Manager 将所有内容公开,摆脱 Ocp-Apim-Subscription-Key

    我有一些通过 Azure API 管理代理的 REST API 出于某种原因 我希望将其公开以应对所有请求 从开发人员的角度来看 我想摆脱在标头 或请求 中设置密钥 Ocp Apim Subscription Key XXXXXXXXXXX
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • 如何触发应用程序通过 REST 服务获取数据?

    我正在寻找一种方法来触发应用程序从远程 REST 服务获取数据 该方法不需要轮询 iOS 推送通知似乎不是一个选项 因为它可以被用户停用 然而 我可能是错的 是否有最佳实践来完成此任务 实际上 推送通知是可行的方法 在 ios8 及更高版本
  • 从 iTunes ID 查找播客源的 URL。 (iTMS API)

    我正在研究一种将 iTunes 播客 ID 转换为播客制作人提供的 RSS 提要的方法 我知道RSS 生成器 http ax itunes apple com rss 可用于生成播客链接的提要 但这些链接指向 HTML 页面 如果您打开 i
  • RESTful API:仅用于验证的方法/标头组合

    我希望我的 API 有一个仅验证请求 例如 如果我有一个 URL 例如 http api somesite com users 12345 用户正在客户端上填写一份信息表单 我最终会将其修补 放置 发布到该资源 当用户填写表单时 我可能希望
  • 如何在 Codeigniter 中我自己的控制器中生成 API 密钥

    只是想提一下 我确实是 API 开发 概念 结构 最佳实践 方面的新手 我对它一点也不熟悉 所以如果您发现我正在使用 Phil 请原谅我可悲的愚蠢问题Sturgeon 的 REST API 服务器 Curl 库和 REST API 客户端这
  • 为什么“FormDataMultiPart”类型参数被区别对待

    我正在编写一个小网络应用程序 将文件上传到网络服务器 我一切正常 但令我感到困惑的是 几乎所有从客户端 浏览器 发送的参数都必须在服务器端注入单词 FormDataParam except FormDataMultiPart类型参数 有人可
  • 当前用于验证 Http 请求(REST、Xml over Http)的标准是什么?

    该标准应解决以下身份验证挑战 例如 重放攻击 中间的人 明文攻击 字典攻击 暴力攻击 被假冒服务器欺骗 我已经研究过 Amazon Web Services 这是一种可能性 更重要的是 似乎有两种最常见的方法 使用 apiKey 它的编码方
  • 如何在 Google 知识图谱中搜索具有特定属性的条目?

    应如何制定搜索查询kgsearch googleapis com查找给定类别中的所有条目 例如 如果我想搜索 Schema org 类别中的内容应用类别 http schema org applicationCategory 我该怎么办呢
  • Spring Boot 应用程序中的 Vaadin 23 Rest-API 和 UI

    我使用 Vaadin 23 3 5 开发了一个小型应用程序 到目前为止 我仅将 Spring Boot Security 与默认的 LoginView 结合使用来进行身份验证 然后使用 MainLayout 来浏览我的应用程序 但现在我需要
  • SoftLayer_Account::getOperatingSystemReloadImages

    我想在 OSReload 期间使用 API 获取可用操作系统列表 我发现提到了 SoftLayer Account getOperatingSystemReloadImages 方法 但找不到该方法的用法 谁能帮我解决这个问题 谢谢 我找不
  • 在 Postman 中连接 ECONNREFUSED

    我试图通过邮递员测试我的 REST API 但收到以下错误 这是我编写的第一个 REST API 我对邮差很陌生 所以不确定我做错了什么 下面是我尝试使用此 URL 在邮递员中调用的代码 我在 URL 中传递两个日期参数 https loc
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • neo4j - python 驱动程序,服务不可用

    我对 neo4j 非常陌生 我正在尝试建立从 python3 6 到 neo4j 的连接 我已经安装了驱动程序 并且刚刚开始执行第一步 导入请求 导入操作系统 导入时间 导入urllib 从 neo4j v1 导入 GraphDatabas

随机推荐