我正在使用具有非常复杂的访问控制规则的系统中的API。通常,需要复杂的SQL查询来确定用户是否具有对特定资源的读取或写入访问权限。这会在我们的客户端应用程序中造成很多复杂性和冗余,因为他们必须知道所有这些规则,以确定是否为每个对象呈现用户CRUD选项。
我的目标是减少客户端的大部分复杂性,并容纳API中的所有复杂逻辑。这样,在确保UI仅向用户提供有效选项时,针对我们的API编写的新客户端应用程序可以避免重新实现复杂的访问规则逻辑。
我不确定处理此问题的最佳方法是什么。我考虑了两种不同的选择,但我不知道是否有更好或更标准的方式向API的调用者公开通用访问信息。
当调用者对资源实体或它们的集合发出GET请求时,每个返回的实体都将返回附加的_allowed_actions
字段,这是允许调用者在该实体上执行的一系列操作。例如,请求Listing
对象可能会导致以下响应。
GET / listing / 5
{
"id": 5,
"address": "123 Foo Street",
"city": "New York",
"state": "New York",
"price": 457000,
"status": "pending",
"_allowed_actions": ["READ", "UPDATE", "DELETE"]
}
仍然不确定如何与客户联系是否他们有权使用此方法创建资源实体的实例,但客户可能只需要保持对权限结构的充分理解以自行确定。围绕创建实例的访问规则通常不如READ / UPDATE / DELETE访问规则复杂,因此看起来不太糟糕。
创建一个元API,客户端可以向其发出请求,以确定他们可以对每个资源执行哪些操作。例如,检查客户端可以对列表执行的操作:
GET / access-query / listing / 5
{
"allowed_actions": ["READ", "UPDATE","DELETE"]
}
并检查一般情况下允许列表的选项,包括CREATE:
GET / access-query / listing
{
"allowed_actions": ["READ", "CREATE", "UPDATE", "DELETE"]
}
这种方法的好处是,它允许呼叫者以通用方式充分了解他们可以对每种资源做些什么。这样客户就不必理解" create_listing"权限和非试用用户状态是创建列表所必需的。他们可以提前查询这些信息。
这种方法的缺点是它增加了请求量。他们现在不必要求客户了解权限逻辑,而是先查询一次以确定他们可以做什么,然后再进行第二次查询。
我并不特别关心这些方法中的任何一种方法,但我们目前只能提出这些方法。有没有更好的方法来解决这个问题?
答案 0 :(得分:7)
您正在寻找的是细粒度的外部授权:
有一种称为基于属性的访问控制(ABAC)的模型,它定义了细粒度外部化授权的方法。美国国家标准与技术研究院(NIST)已经制作了report on ABAC,您可以在线阅读。
OASIS是推进结构化信息标准的组织,它定义了一个名为XACML(可扩展访问控制标记语言)的标准来实施ABAC。
XACML为您带来:
使用基于XACML的方法,您可以将业务逻辑和API与授权逻辑分开。这有几个好处:
我建议您查看以下资源:
XACML有供应商和开源实现:
HTH, 大卫。
答案 1 :(得分:2)
没有尝试复活一个旧问题,但我来到这里寻找几乎完全相同的东西,并希望添加一个我认为更加RESTful的解决方案。
我实际上没有实现这一点,但认为它可能会帮助其他来到这里的人......
你的第二个选项几乎就是我认为应该做的,但是不要使用OPTIONS动词到你的资源,然后返回"允许"标题包含该资源的可用动词列表。
OPTIONS / listing / 5
假设您的资源非常精细,以便有意义,那么您就会知道是否可以进行POST / DELETE