前后端分离中后端提供的RESTFUL接口如何进行权限控制?
今天遇到一个问题
我有一个系统,是基于角色的权限控制.
前端自然就是根据角色来控制应该显示的视图.
但是为了防止别人直接用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有可能在接口层处直接进行角色权限的控制并且所需要的角色从数据库中获取吗?
各位大侠,感激不尽!
------以下补充-----------
前后端通过token验证这是肯定的,我想问的其实是token验证通过之后
那我手上的数据有
1.当前访问的URL
2.当前用户,当前用户的角色
我是觉得针对角色去维护URL实在是比较麻烦.来想问问有没有更好的解决方案
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
基于角色的权限控制不是一个好办法,具体可以看这篇文章:https://stormpath.com/blog/ne...
我的项目也是用的shiro,不是基于角色的,而是基于permission。简单来说就是这样的:
每个url、菜单、按钮都是一个resource,这个resource有对应的permission
角色拥有permission(若干)
判断这个角色能不能获得资源的方法很简单,看这个角色有没有对应资源permission就行了
在这里只有permission是写死的
一般会将
资源URL
统一管理起来,会提供管理平台维护权限,利用interceptor/filter
校验用户是否有对应的权限。你想从数据库获取角色是为什么呢?因为权限会变化?这种情况你必须要将资源维护起来,或者想要实现动态权限就不可能。
权限较为简单就像
Tomcat Manager
中的角色一样,那直接使用硬编码这也没有什么问题。最主要是需求要做成什么样子。
我觉得你这是两个问题。
首先防止接口被其他人调用,这个可以使用
token
的机制来做限制,没有token或者token不正确就返回403。剩下的就是权限问题,用shiro和spring security等等都行,可以使用session来区分不同权限的用户。
服务端生成一个token返回给客户端,客户端每次请求就带上这个token,后端用filter统一处理;
如果能解决问题3,那问题2就没意义了;
记忆中shiro是可以在代码层面控制权限的,看一下文档吧。
权限有多个粒度的,动作权限,数据权限,不同状态条件下的权限,仅仅在某个层面上控制不了的,常见的RBAC,ACL都只能做到部分控制,还是要结合自身情况,灵活应用,没有包治百病的妙药。
你可以考虑用下Spring Security或者Shiro进行权限管理,具体操作可以去网上查查资料
现在新推出了一个权限框架,叫jCasbin(https://github.com/casbin/jca...)。jCasbin采用了元模型的设计思想,支持多种经典的访问控制方案,如ACL、RBAC、ABAC,还支持对RESTful API的控制。现在已经支持Spring Boot、JFinal等Web框架了。需要中文文档的话,可以看这篇文章:https://blog.csdn.net/hsluoyc...,或者在百度搜索:jCasbin
支持2楼,一般情况是把uri作为资源统一管理
推荐一个针对restful api的认证鉴权框架 sureness
https://su.usthe.com - https://github.com/tomsun28/s...
提供一个针对restful api,无框架依赖,可以动态修改权限,多认证策略,更快速度,易用的认证鉴权框架^_^