一、前言
什么权限管理,我认为大概包括用户认证与用户授权。只要用用户的系统,都会存在权限管理。
二、权限管理基础
2.1用户认证
首先不管你做没有做过权限管理,如下图你也是熟悉的。
这个图的流程很简单,很直观的看到权限认证的流程走向。那么上图中存在哪些关键的东西,我们来总结一下。
subject:主体 就是系统用户,这个用户可以是真正的人,也可以是程序。上图为登录用户(主人)。
principal:身份信息 就是主体的身份标志,身份信息是一对多关系。上图你可以是群主,也是尊贵的QQ会员(身份体现)。
credential:凭证信息 只要主体知道,或者主体提供的信息。例如我们的身份证凭证。上图为登录密码(身份证硬件)。
2.2用户授权
如图为用户授权流程,简单明了。
看图说话:用户认证通过之后,接下来就是
主体subject访问
资源resource的时候,这个时候就需要验证权限
身份principal。如果拥有
凭证credential就可以访问。注意到多一个红色词语,就是资源resource,授权就是对资源进行授权的过程。
如果硬要按照语文课的六要素的话可以划分如下:谁+做+什么
who:主体subject。主体需要访问系统中的资源
-----------谁
what:资源resource。如系统菜单、页面、按钮、类方法、系统商品信息等。
资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的商品为资源实例,编号为
001的商品信息也属于资源实例
----------什么
how:许可permission 规定了主体对资源的操作许可,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过
权限可知主体对哪些资源都有哪些操作许可。
权限分为粗颗粒和细颗粒,粗颗粒权限是指对资源类型的权限,细颗粒权限是对资源实例的权限。
-----------做
如图为资源类型与资源实例权限。仔细品味
三、简易权限模型
简易模式包括:
1、主体:(账户、密码)
2、资源:(资源名称、资源访问地址)
3、权限:(权限名称、资源id)
4、角色:(角色名称)
5、角色权限关系:(角色id、权限id)
6、主体角色关系:(主体id、角色id)
可以建立如下数据表搭建模型:
或者:
2、3合并为资源权限:
权限(权限名称、资源名称、资源访问地址)
四、权限控制
了解了用户认证、用户授权、权限模型之后,我们来看看
权限控制,就是我们上面我们看到的判断。
4.1基于角色控制权限
RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制
例如:if(主体.hasRole("总经理角色id")){
查询工资
}
缺陷:如果懂事长秘书也有查询工资的权限呢??如下
if(主体.hasRole("总经理角色id")||主体.hasRole("懂事长秘书角色id")){
查询工资
}
所有这种我们一般不建议!!!4.2基于资源控制权限
RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制
例如:
if(主体.hasPermission("查询工资权限标识")){
查询工资
}
优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化为总经理和部门经理也只需要将“查询工资信息权限”添加到“部门经理角色”的权限列表中,判断逻辑不用修改,系统可扩展性强。
这一篇我注意讲解了,一些基础模型,即使你用任何权限工具或者自己写权限框架也可以用到。接下来,我活就权限解决方案等一系列方式,我采用shrio框架