对实体/资源进行 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 授权? 的相关文章

  • REST 资源 url 中的查询字符串

    今天 我与一位同事讨论了在 REST URL 中使用查询字符串的问题 举这两个例子 1 http localhost findbyproductcode 4xxheua 2 http localhost findbyproductcode
  • Mandrill 通过 REST API 作为单独的消息发送给多人

    我正在尝试使用山魈发送邮件 问题是 当我将多个收件人添加到 收件人 参数时 它会多次向 收件人 列表中的所有收件人发送同一封邮件 我期望将相同的邮件单独发送给列表中的每个人 我错过了什么吗 key app key template name
  • Codeception API 测试响应返回“N/A”

    我正在使用 Laravel 和 Codeception 作为测试框架编写 API 我无法让 Codeception 返回响应代码 我可以从 Codeception 获取响应代码 以及 JSON 响应 我编写了一个简单的测试来从 GET 请求
  • Web Api - 不允许捕获 405 方法

    截至目前 Web api 应用程序针对 405 方法不允许错误返回以下响应正文 我正在尝试更改响应正文 但我不知道如何使用委托处理程序 ApiControllerActionSelector 或过滤器 谁能帮我捕获服务器端的 405 错误
  • 如何在 REST WCF 服务中接受任意 JSON 对象?

    我想实现这样的服务方法 OperationContract WebInvoke RequestFormat WebMessageFormat Json ResponseFormat WebMessageFormat Json public
  • 如何在 NodeJS 中允许表单数据

    我最近创建了一个接受文件的 API 我正在尝试使用 Postman 测试 API 如果我使用发出帖子请求x wwww form urlencoded身体类型 一切正常 我得到了所有预期的数据 唯一的问题是它不允许发送文件 如果我使用form
  • XML-RPC 与 REST

    我打算在这里构建一个小型服务器 并想为其创建一个 API 我正在决定什么是更好的并且已经排除了SOAP因为在我看来那件事是一团糟 我只剩下REST and XML RPC 我真的很喜欢XML RPC 它实现起来非常简单 并且足够常规 所有客
  • 按照约定应返回哪些 REST PUT/POST/DELETE 调用?

    根据 REST 意识形态 PUT POST DELETE 请求的响应正文中应该包含什么 返回码呢 是HTTP OK enough 如果有的话 这种约定的原因是什么 我发现了一篇描述 POST PUT 差异的好文章 发布与放置 http ww
  • NodeJS 路由器负载太大

    我在 Nodejs 应用程序中创建休息端点 如下所示 在我的 server js 中 我有以下代码 var express require express var app express app use express json limit
  • 重置 Windows Phone 照片上传

    我正在尝试使用 RestSharp 将照片上传到 Windows Phone 7 应用程序中的 REST api 进行获取 发布 post参数如下 photo 照片 编码为多部分 表单数据 照片 相册 id 现有相册的标识符 可以是一个事件
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • 具有用于角色授权的空间的 AD 组

    我正在尝试获得与 AD 组合作的角色授权 然而 由于它包含空格 它似乎不起作用 我尝试过没有空格的 AD 组 它们工作得很好
  • 为什么将 SOAP 用于 Web 服务?

    我读过教程 web service php mysql xml json http davidwalsh name web service php mysql xml json 看来一切都好 但是为什么我们应该使用soap 来提供网络服务呢
  • AllowAnonymous 与 OverrideAuthorizeAttribute

    AllowAnonymous 和 OverrideAuthorizeAttribute 的使用有什么区别 是一样的吗 http www asp net web api overview security authentication and
  • 将策略应用到资源控制器

    我有一个CRUD资源定义通过Route resource User UserController 既然可以生成CRUDGates and Policies 有没有办法应用这样的Gate Policy 以便将相应的Gate Policy应用于
  • 寻找Android源代码

    Android API 是开源的吗 如果是这样 我想看看他们如何实现 ListView 对象的 smoothscroll 方法 这是在 API 级别 8 中实现的 但我想针对早期的 API 级别进行构建 我该如何找到这个 是的 它是开源的
  • Android:GoogleIdTokenVerifier.Builder 中的 Transport 和 jsonFactory 是什么?

    在下面的代码中 什么是transport and jsonFactory 我不明白 https developers google com identity sign in android backend auth using a goog
  • 从 Java 中提取 Lotus Notes Document 的完整 ACL

    我正在尝试找到一种方法来保存特定 Lotus Notes 文档的完整用户列表访问权限 我知道我可以从catalog nsf 获取数据库级ACL 但不能获取文档级访问权限 此外 我相信文档的 作者 字段不会列出只读访问用户 有谁知道如何获取特
  • symfony api 平台深度

    到目前为止 我们一直在 Symfony Doctrine 和 Serializer 深度方面苦苦挣扎 我希望能够使用 Symfony 提供一级深度的 JSON REST API 从而允许我直接从视图管理我的 外键 和关系逻辑 GET peo
  • 自托管 WCF REST 服务和基本身份验证

    我创建了一个自托管的 WCF REST 服务 带有 WCF REST Starter Kit Preview 2 中的一些额外内容 这一切工作正常 我现在正在尝试向服务添加基本身份验证 但我在 WCF 堆栈中遇到了一些相当大的障碍 这阻止了

随机推荐