粒度细到资源ID和用户的权限验证怎么设计好呢?

公孙二狗 发布于 2016/01/26 06:47
阅读 274
收藏 1

使用 Spring Security 或则 Shiro 做基于 Role,Permission 的权限验证比较容易配置,基于 URL 的 pattern 就可以配置(管理的是资源的簇),不过没有看到怎么配置校验资源是否属于某个用户。


例如要写一个博客系统,每个用户只能显示,删除自己的文章 (URL 没有使用 REFTful 的方式操作,这样在这里语义上更能表达清楚意图):
显示文章的 URL 为 /document/list
删除文章的 URL 为 /document/delete/{id}


这 2 个 URL 登录用户都能访问,可以在 Spring Security 里使用配置。


现在有 2 个用户,用户和文章的数据如下:
doc-1 user-1
doc-2 user-2
doc-3 user-1


User Case 0:
1. 匿名用户访问显示文章的页面 /document/list
2. 显示无权操作,因为 Spring Security 配置了这个 URL 只有登录用户能访问


User Case 1:
1. user-1 访问显示文章的页面 /document/list,显示他的文章 doc-1, doc-3
2. 点击 doc-1 对应的删除按钮,访问 /document/delete/doc-1
3. 成功把他自己的文章 doc-1 删除。


User Case 2:
1. user-1 访问显示文章的页面 /document/list,显示他的文章 doc-3
2. doc-3 对应删除按钮的 URL 为 /document/delete/doc-3
3. 我们的用户是个搞技术的,把 doc-3 对应删除按钮的 URL 修改为了 /document/delete/doc-2
4. 点击删除按钮访问 /document/delete/doc-2
5. 成功的把 user-2 的文章 doc-2 删除


问题出现了,user-1 删除了 user-2 的文章,做了没有权限的操作。


解决这个问题说简单也简单,在代码中执行删除前查询下被删除的文章是否属于当前登录用户(doc-2 是否属于 user-1)。但是系统里可能有很多不同类型的资源需要管理,用这种方式处理的话,操作资源前都要写代码判断用户是有权限操作,就会在业务逻辑的代码里到处都是权限判断的代码,感觉不是很好。


问题:
想问一下,有没有其他方式,例如像 Spring Security 那样声明式的来控制用户的资源更新,删除等,而不需要在操作前写代码手工判断。


加载中
0
zimsky
zimsky

使用aop

公孙二狗
公孙二狗
确实是个办法
0
-飞客-
-飞客-
自己做拦截器喽,或者写业务里。
返回顶部
顶部