权限控制,或者说访问控制,普遍应用于各个系统中。抽象地说,是某个主体(subject)对某个客体(object)须要实施某种操做(operation),而系统对这种操做的限制就是权限控制。前端
在网络中,为了保护网络资源的安全,通常是经过路由设备或者防火墙创建基于IP和端口的访问控制。java
在操做系统中,对文件的访问也要访问控制。好比在Linux系统中,一个文件能够执行的操做分为“读”、“写”、“执行”三种,这三种操做同时对应着三种主体:文件拥有者、文件拥有者所在的用户组、其余用户,主体、客体、操做这个三者之间的对应关系,构成了访问控制列表。程序员
在Web应用中,根据访问客体的不一样,常见的访问控制能够经过解决如下几个目标问题来实现:web
-
他是谁? -
他只能访问给他授予了权限的接口! -
他不能查看别人的数据!
下面咱们之前后端分离的项目为例,解释如何解决这几个目标问题:后端
他是谁?
在先后端分离项目中,前端用户登陆后后端服务会给其颁发一个token,好比咱们所熟知的JWT(JSON Web Token),然后每次前端请求后端接口都会带上这个token。因为JWT上会带有用户信息,此时咱们要作的就是校验这个token对应的用户是否为系统合法用户。安全

他只能访问给他授予了权限的接口!
光知道他是系统的合法用户仍是不够,web应用还得保证当前用户只能访问他拥有权限的接口。服务器
好比有个薪资查询的接口,业务上只容许部门领导角色访问。若是系统不作控制,张三知道了薪资查询接口,就拿着本身的token去调用此接口而后就能知道全部员工的薪资了,这种问题咱们称之为"越权访问"。微信
处理这个问题如今应用普遍的一种方法就是“基于角色的访问控制(RBAC:Role-Based Access Control)”,也称“垂直权限管理”。网络
RBAC事先会在系统中定义出不一样的角色,不一样的角色拥有不一样的权限,一个角色实际上就是一个权限的集合。而系统的全部用户都会被分配到不一样的角色中,一个用户可能拥有多个角色。架构
当用户带着token请求后端服务时,咱们还得经过token查询出当前用户所属的角色,而后根据角色查询出用户拥有的全部权限。权限框架 Spring Security
和 Shiro
都很好的支持RBAC控制。

他不能查看别人的数据!
张三和李四都是部门领导,他们均可以查询员工薪资的权限。可是他们都只被容许查看本身部门员工的薪资。张三知道了接口调用规则,就能够经过修改调用参数获取李四部门员工的薪资了,这种状况固然也是不被容许的。
在RBAC模型下,系统只会验证用户A是否属于角色RoleX,而不会判断用户A是否能访问只属于用户B的数据DataB,所以发生了越权访问。这种问题咱们称之为“水平权限管理问题”。
如今数据级权限管理并无很通用的解决方案,通常是具体问题具体解决。
简单的作法是给接口请求加上秘钥,经过接口参数+当前系统登陆人一块儿进行加密发送给后端服务,后端接受到请求后对加密内容进行解密,根据约定的规则解析出用户信息并与登陆用户进行匹配,匹配上正常访问,匹配不上则拒绝访问。

以上,但愿对你有所帮助!
干货分享
这里为你们准备了一份小小的礼物,关注公众号,输入以下代码,便可得到百度网盘地址,无套路领取!
001:《程序员必读书籍》
002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》
003:《互联网企业高并发解决方案》
004:《互联网架构教学视频》
006:《SpringBoot实现点餐系统》
007:《SpringSecurity实战视频》
008:《Hadoop实战教学视频》
009:《腾讯2019Techo开发者大会PPT》
010: 微信交流群
近期热文top
我就知道你“在看”

本文分享自微信公众号 - JAVA日知录(javadaily)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。