基于Restful的权限设计

yuri-li 发布于 2016/09/18 11:48
阅读 1K+
收藏 1

Restful API可以将所有的模型都看做资源。
直接操作这些资源(CRUD),很容易就可以控制;
但,资源之间如果是一个网状的关系,而不是树,这样的权限设计,怎么做呢?

  • 示例场景描述:


  • 问题描述

 我模拟一种异常情况。
假设,我没有修改章节的权限,但,访问下面的地址,是否可以做到?
url:PUT/知识点/知识点ID/章节/章节ID
json data:与章节Model完全匹配的数据

加载中
0
愤怒的码农0
愤怒的码农0
将交互得资源变成开放资源
yuri-li
yuri-li
怎么开放?
0
code-fans
code-fans

不使用框架:完全通过sevelet + filter 也可以实现,大体思路是

1、通过定义全局请求过滤器,

2、将拦截到的请求获取出请求地址,并判断地址是否已经授权(具体授权的模型另行分析)

3、授权则允许访问,未授权则返回默认(或特定)的页面

使用成熟框架:可以用spring+springmvc + shiro ,基于shiro 实现符合RESTful风格的设计,可以查看官网文档或参考开涛兄的博客

http://jinnianshilongnian.iteye.com/blog/2041909

以下是全套shiro教程(非广告,开涛的文章确实很干活,不只是shiro):

http://jinnianshilongnian.iteye.com/blog/2018398

0
Embers
Embers

这个东西我也想了近一年,非常难,特别是需求还是熵增的

 

例如:

产品,设备,固件资源,企业,数据点,这5个实体,网状结构下来

特定的产品有特定的设备,同时拥有特定的数据点作为设备的特征,设备有它在用的固件,而产品归属于企业

这5个实体作为资源,分别开放接口给管理员,前线,用户,顾客,不同角色/等级的人用

 

然后在这个基础上还会增加新的实体,新的资源,例如设备组,子公司,因此不能使用常规小型系统的设计了,只能将权限设计到URL,建立黑白名单

{
    "black_list":[{
        "GET":["/enterprise","/enterprise/*/product"],
        "POST":["/enterprise/enterpriseId1/product/productid1/device"],
        "PUT":[""],
        "DELETE":[""]
    }],
    "white_list":[{
        "GET":["*"],
        "POST":[""],
        "PUT":[""],
        "DELETE":[""]
    }]

对URL进行全匹配,先匹配白名单,再匹配黑名单,过了才进业务

对于这个结构,最好添加正则通配引擎,不然无穷无尽的url,还有一般都是登录过后用户权限就进ram(redis/memcache),所以基本的压缩编码还是需要的(Huffman),restful的无状态决定了每次都要验证,之后只要从ram里面取就行了

 

还有另外两种设计思路,一种是资源级(模块级),一种是函数级,太复杂了

0
yuri-li
yuri-li

纯文字版的,格式在发布后,就消失了...红薯,你在搞笑吗?所以,换成了图片

返回顶部
顶部