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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
回答你这个问题,你先要有两个概念:
resources
和action
另外,有一个观念:resources 名字通常与 controller 名字是对应的。
像你这个例子:
访问某个 url,最后就会有对应的 controller#action 进行处理。
你要做的事情,有两个:判断是否登录,判断是否有权限。
如何判断是否登录,这里就不说了。
下面说说权限,已登录用户,访问:
我这里可以列出不同程度的方案:
在 bank-cards action 里,获取 userId =1 的用户,判断这个用户是否为当前用户?是,则可访问;不是,则不可访问
简单的角色,例如加字段 is_admin? 如果为 true 则可访问所有资源
复杂一点用户、角色、权限。A 用户属于 bb 角色,所以有 ccc 权限。
上面没有直接回答,下面直接回答你。
1)每个URL里面都包含了动态的值,我拦截器拦截到该 URL 以后怎么判断是不是有权限访问。
URL 包含的值是动态的,但 action 却是固定的,像:
判断一次就行了。
2)每个 action 都要判断?
看情况,像前面提到的 show action 一般都不需要;而敏感操作都要做判断的,具体判断方式上面已经说了。
如果每个 action 都像上面第 1 种方式做判断,很容易就产生重复代码,并且后续不好维护。所以,实际操作,需要你自己把控,最好还是有统一管理的地方。可参考第 2、3 种方式。
https://segmentfault.com/q/1010000003041387
关于Restful设计等等的文章是在太多了:基于RESTful API 怎么设计用户权限控制?
这个一般可以从两个方面来做 首先是路由层面的控制 例如禁用get等等需求 这种通常可以在路由树层面就做好控制 具体看你框架了 除此以外 业务上的权限控制 可以在具体控制器去做限制 例如继承公共父类 统一在初始化时检查权限 或者像java一样写filter做一层过滤 大致都是这么些思路 基本各个语言都通用 看你具体实现了。
我觉得可以在每次请求中加入token就可以了啊。。。
可以在第一次登陆的时候,使用账号和密码来获取token。。。在一段时间之后失效。。。
我对你的提出的问题的理解是:比如当前是用户1登录,id为1,访问url为:/users/1/bank-cards,若是访问/users/2/bank-cards就算越权。若是这种情况的话,我的做法是获取url后利用正则表达式去匹配url,通过匹配url来获取那个userid,从而与当前登录的账号对比判断是否越权。
用openauther2.0即可,非常成熟的方案
和正常的写法没什么区别啊,action里取当前用户id和参数中id相同就有权限