首页 > RESTful API 如何做权限控制

RESTful API 如何做权限控制

如题,RESTful 做权限控制:
有如下的URL:

# 获取用户拥有的银行卡
GET /users/{userId}/bank-cards

当userId等于1的用户来获取自己的银行卡是的URL为:

GET /users/1/bank-cards

当userId等于2的用户来获取自己的银行卡是的URL为:

GET /users/2/bank-cards

在这种情况下,如何判断用户是否可以访问当前的URL。
因为每个URL里面都包含了动态的值,我拦截器拦截到该URL以后怎么判断是不是有权限访问。
在比如,下面获取余额的这个URL,我如何判断当前登录的用户是否可以获取余额信息:

GET /accounts/{accountId}/balances

关于Restful设计等等的文章是在太多了:基于RESTful API 怎么设计用户权限控制?


这个一般可以从两个方面来做 首先是路由层面的控制 例如禁用get等等需求 这种通常可以在路由树层面就做好控制 具体看你框架了 除此以外 业务上的权限控制 可以在具体控制器去做限制 例如继承公共父类 统一在初始化时检查权限 或者像java一样写filter做一层过滤 大致都是这么些思路 基本各个语言都通用 看你具体实现了。


https://.com/q/1010000003041387


我对你的提出的问题的理解是:比如当前是用户1登录,id为1,访问url为:/users/1/bank-cards,若是访问/users/2/bank-cards就算越权。若是这种情况的话,我的做法是获取url后利用正则表达式去匹配url,通过匹配url来获取那个userid,从而与当前登录的账号对比判断是否越权。


我觉得可以在每次请求中加入token就可以了啊。。。
可以在第一次登陆的时候,使用账号和密码来获取token。。。在一段时间之后失效。。。


回答你这个问题,你先要有两个概念:resourcesaction
另外,有一个观念:resources 名字通常与 controller 名字是对应的。

像你这个例子:

# resources 为 users,通常来说它是展示页,所以 action 一般为 show
# controller 为 users controller
/users/{userId}

# resources 为 users,action 为 bank-cards
# controller 为 users controller
/users/{userId}/bank-cards

访问某个 url,最后就会有对应的 controller#action 进行处理。
你要做的事情,有两个:判断是否登录,判断是否有权限。

如何判断是否登录,这里就不说了。
下面说说权限,已登录用户,访问:

GET /users/1/bank-cards

我这里可以列出不同程度的方案:

  1. 在 bank-cards action 里,获取 userId =1 的用户,判断这个用户是否为当前用户?是,则可访问;不是,则不可访问

  2. 简单的角色,例如加字段 is_admin? 如果为 true 则可访问所有资源

  3. 复杂一点用户、角色、权限。A 用户属于 bb 角色,所以有 ccc 权限。


上面没有直接回答,下面直接回答你。

1)每个URL里面都包含了动态的值,我拦截器拦截到该 URL 以后怎么判断是不是有权限访问。

URL 包含的值是动态的,但 action 却是固定的,像:

GET /users/1/bank-cards
GET /users/2/bank-cards

判断一次就行了。

2)每个 action 都要判断?

看情况,像前面提到的 show action 一般都不需要;而敏感操作都要做判断的,具体判断方式上面已经说了。
如果每个 action 都像上面第 1 种方式做判断,很容易就产生重复代码,并且后续不好维护。所以,实际操作,需要你自己把控,最好还是有统一管理的地方。可参考第 2、3 种方式。


用openauther2.0即可,非常成熟的方案


和正常的写法没什么区别啊,action里取当前用户id和参数中id相同就有权限

【热门文章】
【热门文章】