一、权限管理
1、什么是权限管理
权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问且只能访问自己被授权的资源。
权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限才可以访问该资源。
2、用户身份认证(认证)
身份认证,就是判断一个用户是否为合法用户的处理过程。最简单的身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。
3、用户名密码身份认证流程
4、身份认证涉及到的关键对象
- Subject:主体
访问系统的用户,主体可以是客户、程序等,进行认证的都称为主体。 - Principal:身份信息
身份信息是主体进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、密码等,一个主体可以有多个身份,但必须有主身份(Primary Principal)。 - Credential:凭证信息
凭证信息是主体自己知道的安全信息,如密码、证书等。
5、授权
授权,即访问控制,控制谁能访问那些资源。主体进行身份认证后需要分配权限才可以访问系统的资源,对于某些资源没有权限是无法访问的。
6、授权的流程
7、授权的关键对象
- Who:主体(Subject),主体需要访问系统中的资源。
- What:资源(Reasource),如系统的菜单、页面、按钮、类方法等;资源包括资源类型和资源实例两部分,比如商品信息为资源,编号为1的商品信息为资源实例。
- How:权限/许可(Permission),规定了主体对资源的操作许可,权限离开资源没有意义。权限分为粗颗粒权限和细颗粒权限。
(1)粗颗粒权限:对资源类型的权限,在权限控制的公共代码中进行控制。
(2)细颗粒权限:对资源实例的权限,在业务逻辑中进行单独处理。 - 主体、资源、权限关系图 :
8、权限模型
(1)主体、资源、权限的数据模型。
主体(账号、密码)
资源(资源名称、访问地址)
权限(权限名称、资源id)
角色(角色名称)
角色和权限关系(角色id、权限id)
主体和角色关系(主体id,角色id)
(2)数据模型图:
(3)通常开发中将资源和权限表合为一张权限表。
资源(资源名称、访问地址)
权限(权限名称、资源id)
合并为:
权限(权限名称、资源名称、资源访问地址)
9、权限分配
对主体分配权限,主体只允许在权限范围内对资源进行操作,比如:对u01用户分配商品修改权限,001用户只能对商品进行修改。
权限分配的数据通常需要持久化,根据上边的数据模型创建表并将用户的权限信息存储在数据库中。
10、权限控制
用户拥有了权限即可操作权限范围内的资源,系统不知道主体是否具有访问权限需要对用户的访问进行控制。
(1)继续角色的访问控制
RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:
缺点:以角色进行访问控制粒度较粗,如果上图中查询工资所需要的角色变化为总经理和部门经理,此时就需要修改判断逻辑为“判断主体的角色是否是总经理或部门经理”,系统可扩展性差。
(2)基于资源的访问控制
RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制,比如:主体必须具有查询工资权限才可以查询员工工资信息等,访问控制流程如下:
优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化为总经理和部门经理也只需要将“查询工资信息权限”添加到“部门经理角色”的权限列表中,判断逻辑不用修改,系统可扩展性强。
二、权限管理解决方案
1、权限分类
(1)粗颗粒度权限和细颗粒度权限
对资源类型的管理称为粗颗粒度权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。
(2)粗颗粒度管理
对于粗颗粒度的权限管理可以很容易做系统架构级别的功能,即系统功能操作使用统一的粗颗粒度的权限管理。
(3)细颗粒度管理
对于细颗粒度的权限管理不建议做成系统架构级别的功能,因为对数据级别的控制是系统的业务需求,随着业务需求的变更业务功能变化的可能性很大,建议对数据级别的权限控制在业务层个性化开发,比如:用户只允许修改自己创建的商品信息可以在service接口添加校验实现,service接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一致则不允许修改商品信息。
2、基于url拦截进行权限控制
基于url拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行继续访问。
3、使用权限管理框架
对于权限管理基本上每个系统都有,使用权限管理框架完成权限管理功能的开发可以节省系统开发时间,并且权限管理框架提供了完善的认证和授权功能有利于系统扩展维护,但是学习权限管理框架是需要成本的,所以选择一款简单高效的权限管理框架显得非常重要.