一种新的 RESTful 权限设计讨论

2017-04-12 10:40:14 +08:00
 prasanta

请求权限映射

根据RESTful的相关风格规范, 我们将请求映射为以下几种操作

GET     /users/                ----->  `list.users` 
GET     /users/:id/            ----->  `retrieve.users`
POST    /users/                ----->  `create.users`
PUT     /users/:id/password/   ----->  `replace.users`
PATCH   /users/:id/            ----->  `update.users`
DELETE  /users/:id/            ----->  `destroy.users`

权限控制器映射

如果后端以MVC模式进行开发, 那么我们可以映射如下控制器

`list.users`        ----->  list(users) 
`retrieve.users`    ----->  retrieve(user,id)  
`create.users`      ----->  create(users)       
`replace.users`     ----->  replace(users,id,field)   
`update.users`      ----->  update(users,id)           
`destroy.users`     ----->  destroy(users,id)           

鉴权流程

权限的管理采用传统的RBAC模式

  1. 身份验证,返回具体user或者anonymous,接下来我们把这一步返回的user都作为正常user
  2. 验证请求权限,即上述验证请求权限映射
  3. 验证资源存在性与所属权, 这里存在争议.
    • 如果放到控制器之前, 那么可能会出现格外数据库查询,同时会增加代码上的复杂性, 但是可以把所有鉴权过程放到一起.
    • 如果放到控制器中,鉴权过程分开了,由于不同的资源可能有不同的所属权判断标准,这样可以增加灵活性.

讨论点

  1. 资源存在性与所属权放到控制器里还是作为中间件放到控制器之前?
  2. 请求权限映射有哪些需要改进的地方?
  3. 能否将整个认证鉴权流程规范化?
6159 次点击
所在节点    Python
24 条回复
wc951
2017-04-12 19:05:54 +08:00
没觉得新在哪啊, apache shiro 不就在干这事吗,不过那个是 java 的
hantsy
2017-04-12 19:09:14 +08:00
@zhengxiaowai Patch 已经有相关的具体标准 JSON Patch 等,去修改 Entity 部分属性。

https://tools.ietf.org/html/rfc6902

之前我用到了 Spring Sync 支持 Patch 。

https://spring.io/blog/2014/10/22/introducing-spring-sync

下一代的 JAXRS 2.1 ( Java EE 8 标准)会加入官方的 Patch 支持(虽然自己实现不难)。
ihuotui
2017-04-12 21:47:53 +08:00
权限
如果你是了解 spring mvc,权限验证可以放在 interceptor
http->tomcat->interceptor(check user is login and auth resource)->biz_service
restful 风格,感觉它只是给了一个指导,实际需要我们自己拓展.
我建议使用 biz_group/biz_add or other 数据放在 post 中
因为在复杂业务下,需要表达的含义远多于 crud,从可读代码上看
honmaple
2017-04-13 00:20:46 +08:00
我是觉得作为中间件放到控制器之前好,首先代码侵入性较小,其次只需要单独维护一套权限系统就行,只要简单修改就可以用到其它系统中,权限的验证无非是验证 + 回调,我不认为会增加复杂性,当然,会造成额外的数据查询这是个问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/354273

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX