咱们开发一个系统,必然面临权限控制的问题,即不一样的用户具备不一样的访问、操做、数据权限。造成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control)、强制访问控制(MAC: Mandatory Access Control)、基于属性的权限验证(ABAC: Attribute-Based Access Control)等。最常被开发者使用也是相对易用、通用的就是RBAC权限模型(Role-Based Access Control),本文就将向你们介绍该权限模型。程序员
RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。模型中有几个关键的术语:spring
RBAC权限模型核心受权逻辑以下:数据库
想到权限控制,人们最早想到的必定是用户与权限直接关联的模式,简单地说就是:某个用户具备某些权限。如图:springboot
这种模型可以清晰的表达用户与权限之间的关系,足够简单。但同时也存在问题:框架
在实际的团体业务中,均可以将用户分类。好比对于薪水管理系统,一般按照级别分类:经理、高级工程师、中级工程师、初级工程师。也就是按照必定的角色分类,一般具备同一角色的用户具备相同的权限。这样改变以后,就能够将针对用户赋权转换为针对角色赋权。数据库设计
咱们能够用下图中的数据库设计模型,描述这样的关系。学习
可是在实际的应用系统中,一个用户一个角色远远知足不了需求。若是咱们但愿一个用户既担任销售角色、又暂时担任副总角色。该怎么作呢?为了增长系统设计的适用性,咱们一般设计:操作系统
咱们能够用下图中的数据库设计模型,描述这样的关系。设计
为了适应这种需求,咱们能够把页面资源(菜单)和操做资源(按钮)分表存放,如上图。也能够把两者放到一个表里面存放,用一个字段进行标志区分。3d
数据权限比较好理解,就是某个用户可以访问和操做哪些数据。
因此为了面对复杂的需求,数据权限的控制一般是由程序员书写个性化的SQL来限制数据范围的,而不是交给权限模型或者Spring Security或shiro来控制。固然也能够从权限模型或者权限框架的角度去解决这个问题,但适用性有限。