概述
权限控制模型和方式中介绍了先腾框架权限控制的方法和控制的粒度。框架只能通过角色为用户授权,不能将操作权限直接赋给用户。这样做主要是为了简化权限模型。这一篇主要讲用户的授权模式。
业务和操作定义
权限控制模型和方式中介绍框架中的操作权限是和代码Controller类中的方法一一对应的。这个类通常是一个业务。所以框架中的业务和操作模型是这样定义的:
- 一个业务模块通常对应业务需求,每一个业务模块有一个业务id(optId)作为他的主键,它在框架中有以下属性:
- 基本属性:名称、业务类别(一般业务,实施业务:只在实施入口中展示)
- 业务入口url,这个属性并不是必须的,通常作为菜单的入口时需要。
- 一组相关的操作权限
- 一组业务数据操作范围定义
- 业务操作是框架控制权限的单元,它对应Controller类中的一个方法,它有一个方法名(optMethod),这方法名和业务id构成这个业务操作的唯一标识。业务操作还有以下属性:
- 基本属性:名称、方法名
- 每一个业务操作和一个http请求对应,它可以有 url + http 方法(C:post, R:get, U:put, D:delete)表示,url中参数部分用“*”作为通配符代替。
- 业务数据范围定义;业务数据范围是一组参数驱动SQL的外部过滤条件。它的形式为:
[对象或者表.字段或者属性] sql的操作符比如:= {用户.属性:(预处理)参数名}
角色权限
角色的定义
前面的“权限控制模型和方式”中说了框架是通过用户是否具备相关操作对应的角色来判断用户是否具有相关权限的。角色在框架中就是一组操作权限和数据范围权限的结合。在操作定义中 操作权限和数据范围权限是对等的,都是作为业务的子属性(子表),但是在角色定义中,它们不是对等的:
- 角色对应一组业务操作
- 可以为每个业务操作选择这个业务对应的操作范围权限,如果不选不是没有数据范围权限而是数据范围权限不受控制,即有所有范围的权限。
角色类别
框架有以下角色类别:
- F (Fixed)系统内置的,固有的,这些角色不能删除,但是可以修改其对应的的操作权限。
- G (global) 全局的,这个就是给系统管理员用,分级管理员不能使用这个角色。使用角色是值将角色赋予个人。
- P (public) 公用的,这个是系统管理员和分级管理员都可以使用的角色。
- D (department)部门(机构)特有的角色,这个式分级管理员创建的,并且只有对应的机构可以使用的角色。
- H (HIDE) 隐藏角色,不要显示的,是部门可以自己支配的操作权限集合。分级管理员创建的角色只能在对应的部分所有具有的H类型的角色权限范围内选择。
一个业务系统根据自己业务需求选择对应的策略,如果不需要分级管理,就只需要F和G 两类角色。
内置角色
内置角色就是F类型的角色,它们有:
- anonymous:匿名角色;用户在没有登录的状态下具有的角色。
- public:公共角色;所有登录用户具有的角色,这个角色不需要显示的赋给任何人。
- forbidden:禁用的功能;和public相反,这个角色对应的功能任何人都不能访问,同样不需要赋予任何人。
- sysadmin : 系统管理员;一般只赋予它系统维护功能,不能赋予它业务功能。
角色授权
角色授权就是将角色赋予用户,框架提供了多种授权策略,开发人员可以根据业务的需求选择不同的策略。总体授权可以分为两种,显式授权和隐式授权。一个用户具有的权限为它所有途径获得的角色之和。
显式授权
显示授权非常简单,就是系统管理员将全局或者公共角色授予某个具体的人,或者分级管理人员将部门角色或者公共角色授予某个具体的人。这些授权数据直接持久化到数据库中就可以了,参见框架源码中的UserRole对象。
隐式授权
隐式授权就是,不是通过将角色和用户直接关联而获取的权限,一共有两种方式获取。
固定角色
固定角色中的anonymous 会默认的给所有未登录的用户,public 会给所有的登录用户。系统会根据用户的登录状态赋他们这两个角色之一。
部门角色
部门角色是框架的一个可选的特性,一个角色赋给一个部门,这个部门中的所有成员都将继承到这个角色。部门角色也有一个可以配置的选项,就是这个部门角色是否会根据部门的层级自动拓展到下级的部门人员。部门层级的拓展目前是通过用户角色视图来做的。对开发人员来说需要知道这个细节。
角色和岗位、职务的关系
用户的岗位和职务一般用于业务流程中的任务分配,这个任务分配也可以认为是一种业务权限或者流程权限,参见用户机构关系计算引擎。本文的角色主要是管理功能权限的,它们是两个维度的权限管理体系,在一般的OA系统中这两套体系应该式并行的。但是往往功能用户在业务系统中的功能权限和他(她)的岗位、职务也有相关性,这样我们可以在岗位职务信息中定义一个默认的功能角色,在给用户赋予新的岗位或职务时会自动添加这个角色,当然系统管理员还可以手动删除这个角色。
注 目前这个设置是放在数据字典中的岗位和职务字典的EXTRA_DATA2这个字段中的。
分级授权
分级授权也是框架的可以可选的特性,开发根据业务的需要可以进行裁剪。
一个分级管理员的管理范围只能和他所在的默认机构(组织)关联。就是一个分级管理员只能管理他所在的机构以及下级机构的权限。
分级管理员可以新建这个机构私有的角色(部门角色),并且可以将这些角色赋予用户。但是分级管理员不能在全局的功能权限列表中建立自己的私有角色,他只能在他的部门具有的功能权限中新建角色。部门的权限式通过“隐藏角色”来获得的。 系统(全局)管理员可也给机构赋予权限,给机构赋予的权限对应为代码 **“G-”+[部门代码]**的角色。