RESTful授权

时间:2009-09-11 01:28:26

标签: architecture rest permissions authorization

3 个答案:

答案 0 :(得分:8)

抱歉,我没有时间做正义的这个问题,但很高兴看到一些经过深思熟虑的问题。 以下是一些评论:

不要陷入将HTTP谓词映射到CRUD的陷阱。是GET和DELETE映射非常干净,但PUT可以执行创建和更新(但仅完全替换),POST是通配符动词。 POST实际上是处理不适合GET,PUT和 删除。

使用属性来表示对象的状态只是一种状态管理方法。我猜您可以想象以下请求可能会做什么:

POST /LockedPosts?url=/Post/2010

子资源也是管理资源当前状态的有效方法。我不觉得有必要以一致的方式处理资源的“状态”属性及其“数据”属性。

尝试将资源直接映射到表格会严重限制您。不要忘记,当您遵循REST约束时,您可以使用的动词突然非常有限。您需要能够在您使用的资源中创造性地弥补这一点。将自己限制为一个资源等于一个表将严重限制最终应用程序的功能。

我们经常看到Rails,ASP.NET MVC和WCF Rest用户在StackOverflow上发布关于如何在REST约束下做某些事情的问题。问题通常不是REST的约束,而是框架在支持RESTful应用程序方面的局限性。我认为首先找到问题的RESTful解决方案然后看看是否可以将其映射回您选择的框架是至关重要的。

创建一个存在于比资源本身更细粒度的权限模型。请记住,其中一个关键的REST约束是超媒体。超媒体不仅可用于查找相关实体,还可用于表示有效/允许的状态转换。如果返回包含嵌入式链接的表示,有条件地基于权限,则可以控制谁可以执行哪些操作。即如果用户有权解锁POST 342,那么您可以返回表示中嵌入的以下链接:

<Link href="/UnlockedPosts?url=/Post/342" method="POST"/>

如果他们没有该权限,则不要返回该链接。

我认为你在这里遇到的一个困难就是你想要立刻咀嚼太大的问题。我认为您需要查看您尝试向客户端公开的RESTful接口,作为管理权限和谓词的一个明显问题,以便管理域模型中的授权。

我意识到我没有直接回答你的任何问题,但希望我提供了一些可能在某种程度上有所帮助的观点。

答案 1 :(得分:2)

我最近发现了一种认证解决方案,似乎解决了我的大多数问题。如果你最喜欢这个问题,那么你可能会感兴趣:

https://github.com/stffn/declarative_authorization

答案 2 :(得分:0)

正如Darrel指出的那样 - REST不是CRUD。如果您发现已识别的资源过于粗糙,以至于统一接口无法提供足够的控制,则将资源拆分为子资源,并将原始资源用作其组件超链接的“集合”。