前后端分离中后端提供的RESTFUL接口如何进行权限控制? 财富值61

2016-10-11 07:45发布

今天遇到一个问题

我有一个系统,是基于角色的权限控制.
前端自然就是根据角色来控制应该显示的视图.
但是为了防止别人直接用httpclient访问,那么后台肯定也要对相应的权限进行控制.
进行交互时,我能知道的只有用户是谁
从而我可以知道的他的角色.

那么我想知道在代码层级的控制是怎么控制的.
如何控制某个角色只能访问一类url?

我的想法是
1.后台需要维护整个系统的url(即提供的接口)
2.维护系统所需要使用的视图(菜单,按钮等,因为接口的使用与视图基本绑定)
3.视图和角色绑定,用户和角色绑定

这样做就很麻烦
1.维护整个系统的url工作量超大
2.维护视图对应的接口URL工作量也超大
3.基于资源的RESTFUL接口有很多在url上的参数,正则会比较复杂,情况较多

后来,我看到了SHIRO中可以这样进行权限控制

在接口中,如springmvc接口

@RequireRoles("admin") @RequestMapping("/{id}") public void get(){    xxx }

如何我可以这样,直接接口所需要的角色使用Annotation在接口层处拦截,工作量就大大减少.但是目前看到的方案这种的role都只能hardcode.不能从数据库动态获取.

所以问题有3个.
1)大家这种情况是怎么处理的
2)我的工作量十分大的方案是否合理?是否有改善的方法
3)shiro有可能在接口层处直接进行角色权限的控制并且所需要的角色从数据库中获取吗?

各位大侠,感激不尽!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答

每一个后端的请求都需要进行验证,比如说一个获取用户信息列表的ajax请求,那么会验证当前的请求有没有权限获取啊,去获取请求的cookie,在和服务器上的session做个判断,如果有权限就给他数据,如果没有就返回403之类的。

一般会将资源URL统一管理起来,会提供管理平台维护权限,利用interceptor/filter校验用户是否有对应的权限。

我觉得你这是两个问题。

剩下的就是权限问题,用shiro和spring security等等都行,可以使用session来区分不同权限的用户。

权限较为简单就像Tomcat Manager中的角色一样,那直接使用硬编码这也没有什么问题。

你想从数据库获取角色是为什么呢?因为权限会变化?这种情况你必须要将资源维护起来,或者想要实现动态权限就不可能。

如果能解决问题3,那问题2就没意义了;

权限有多个粒度的,动作权限,数据权限,不同状态条件下的权限,仅仅在某个层面上控制不了的,常见的RBAC,ACL都只能做到部分控制,还是要结合自身情况,灵活应用,没有包治百病的妙药。

服务端生成一个token返回给客户端,客户端每次请求就带上这个token,后端用filter统一处理;

最主要是需求要做成什么样子。

一周热门 更多>