APP下载

基于Web的权限管理方案设计

2021-10-30贾薇

科学与生活 2021年19期
关键词:字典实例控制器

贾薇

摘要:在Ruby on Rails 5框架下,设计一个基于Web的权限管理方案,满足粗粒度与细粒度结合的高自由度控制的要求。

关键词:Web;权限控制;粗粒度;细粒度;Ruby on Rails 5

一个大型的信息系统均会具有许多功能和许多用户,这些用户处于不同的岗位、具有不同的级别,他们从信息系统中获取信息与处理信息的职权亦不同,这就要求应用系统提供一种权限管理机制,控制各种用户使用系统的权力访问。[1]一个稳定可靠的权限管理方案,应该具备粗粒度与细粒度结合、高自由度、高扩展性等特点。

设计一个基于Web的信息系统权限管理方案,并在Linux系统中,使用Ruby on Rails 5框架实现,使其具有上述功能特定。

1 系统环境

测试环境为Ubuntu16.04操作系统,Ruby on Rails 5.2.3(以下简称RoR),mysql 5.7数据库。

2 粗粒度权限管理

在RoR构架下,采用控制器(controller)加动作(action)的方式进行逻辑控制。控制器通常用来关联一个特定的对象实例,如人员、车辆等;动作通常表示对对象实例的一个操作,如新建、编辑、删除等;每一个访问比如对应一个控制器和一个动作。这个特性非常容易用来对进行权限的粗粒度管理。

2.1 注册控制器/动作

首先将系统的顶层菜单作为对象,可以新建、存储及修改删除。菜单对象没有业务逻辑,仅用于对控制器进行归纳展示。

将控制器和动作也看做对象进行处理。一个控制器的源文件在上传到服务器之后,并不会自动出现在菜单中,而是需要先注册。一个控制器对象实例必然属于一个菜单对象实例,且包含若干个动作对象实例。

当一个控制器对象注册时,需要填入中文名称和英文名称。中文名称用于菜单展示,英文名称用于读取源文件和访问控制。如新建一个控制器对象,中文名为“组织机构”,英文名为“dept”,属于菜单“用户管理”。系统首先会去读取文件名为dept_controller.rb的源文件,然后对其进行文本分析查找出所有方法名,并自动将方法注册为动作;注册过程可以自动完成,也可以进行人工干预定义更多的属性,如中文名、对应的快捷方式、允许访问的最低权限等级(level,后续详细说明)等。

2.2 设置角色

角色管理界面中,可以看到当前已经注册的所有菜单、控制器、动作,且按照結构排列成树形选项。

被选中的项目按照一定的结构生成JSON格式字符串,并作为角色对象实例的authority属性值进行持久化存储。

需要注意的是,如果系统存在根管理员角色,应将其的authority属性特别标识;使其自动获得所有路径的访问权限,以减少不必要的前端操作。

2.3 生成权限字典

每一个角色应该有一个权限字典。权限字典按照该角色的authority属性以一定结构生成一个Hash对象。其中包含了该角色可见的菜单项、可访问的路径、路径的相关属性等。为提高系统运行效率,权限字典在系统运行期间应常驻内存;可采用Redis等NoSQL方式进行存储。

当系统启动时,生成所有角色的权限字典;当对角色authority属性进行修改后,应更新常驻内存的权限字典。

2.4 访问控制

粗粒度权限管理的访问控制,应配置在每一个控制器的before_action方法中,在登录验证之后进行。根据当前用户的角色和当前控制器/动作,在相应权限字典中查找:如果当前角色的权限字典中有当前控制器/动作,且当前用户的level等级不低于允许访问该动作的level等级,则允许访问;否则执行页面重定向。

2.5 权限字典扩展

上述权限字典也可关联至单个用户。用户可继承角色的权限字典,也可单独维护一个权限字典;用户权限字典优先级应高于角色权限字典。

3 细粒度权限管理

细粒度的权限管理需要考虑到对象实例的某些特性。比如在树状结构的组织机构中,不同分支之间的权限需要隔离,上级机构对下级机构具有权限等。细粒度权限管理和业务逻辑密切关联,需要针对性的设计。采用权限等级level与DNA链两种方式可以解决大部分业务流程对细粒度权限管理的要求。

3.1 权限等级level

所有的对象模型均配置有属性level,数据类型为整形,如有必要还应分为读权限等级r_level和写权限等级w_level。角色实例必须设置level,用户实例继承角色实例的level值,也可单独设置。

当前用户的level值保存在session中,记为session[:level]。

3.1.1 设置实例权限等级

对象实例的权限等级在创建的时候设置,不得大于创建用户的权限等级。如当前用户的权限等级为5,创建的对象实例权限等级最大为5。对于已知的对象,可在创建时设置权限等级默认值:如写权限w_level等于当前用户session[:level];读权限r_level设为0,即所有用户均可读取。应控制r_level不得大于w_level。

3.1.2 读权限

根据当前用户session[:level]控制实例读权限,可将session[:level]前置到SQL请求中,使用where(‘r_level <= ?’,session[:level])语句进行限制。也可在获取到对象实例之后,将对象实例的r_level与session[:level]进行比较,如r_level>session[:level] == true 则返回错误。

3.1.3 写权限

根据当前用户session[:level]控制实例写权限,应在持久化对象之前,将对象实例的w_level与session[:level]进行比较,如w_level>session[:level] == true 则返回错误;否则允许执行update或delete操作。

3.2 DNA链

DNA链在处理树状结构的权限控制时具有特别的优势。比如在基于组织构架的权限控制中,DNA链可以很方便的解决跨部门隔离、上下级权限等问题。

3.2.1 构建DNA链

需要注意的是,一个对象根据业务逻辑,可能会有多条不同的DNA链,以对应不同的业务属性。比如机构内部一份文档,按所属部门分类有一条DNA链记为dept_dna,按文档主题分类有一条DNA链记为category_dna。以标识部门属性的DNA链dept_dna为例进行说明。

对象实例A,属于部门B,部门B是部门C的子部门。部门C的dna为’1-3’,部门B的id为8,则部门B的dna为’1-3-8’;对象实例A继承部门B的dna,则实例A的dept_dna为’1-3-8’。以上流程为后台自动生成,前端不可见。

3.2.2 用户权限

如果业务逻辑要求按照部门细分权限,则应对每个用户设定其所在部门dept_id和权限所在部门handle_dept_id;默认情况下,两个属性的值一致,也可人为修改;如用户X属于部门B,但其具有上级部门C的权限,则其dept_id为8,handle_dept_id为3。用户登陆时将handle_dept_id值保存在session中,記为session[:handle_dept_id]。

3.2.3 访问控制

用户在对实例进行访问时,可将session[:handle_dept_id] 前置到SQL请求中,使用where(‘INSTR(concat('-',dept_dna,'-'),?) > 0’,‘%-’ + session[:handle_dept_id].to_s + ‘-%’)语句进行限制。也可在持久化对象之前,将对象实例的dept_dna与session[:handle_dept_id]进行比较,如session[:handle_dept_id]存在于dept_dna链条中则允许执行update或delete操作。

4 职能岗位

现代机构组织中,传统的科层职能式组织结构因其固有缺点,负面效应越来越明显;适宜分工和综合性复合型的多功能工作部门(岗位)将成为未来生产组织和管理组织发展的一个基本方向[2]。一人多岗、一岗多人、职位(角色)岗位分离的现象越来越普遍。这也对信息系统的权限控制提出了新的要求。

需要注意的是,以下通过职能岗位进行权限控制默认为允许,即不设置时不进行职能岗位控制。

4.1 定义岗位及赋权

岗位可通过中文名称进行定义,应保证其唯一性和可读性;中文名称无法确保唯一性时,应编制岗位代码作为唯一性标识。名称、岗位代码主要用于在源文件中设置岗位准入权限时使用。

每个用户可能对应多个岗位,也可能没有具体岗位,可按一定结构将当前用户对应的岗位id组织为JSON格式字符串进行持久化存储,并在登录时保存在session中,记为session[:duty_ids]。

4.2 粗粒度控制

通过职能岗位进行粗粒度控制有两种方式,一种是直接在源文件中固化,通过职能岗位的名称或岗位代码进行准入控制;一种是在控制器/动作注册时,将允许访问的职能岗位定义到动作中。具体实现方法不再赘述。

4.3 细粒度控制

通过职能岗位进行细粒度控制类似于通过权限等级进行控制:创建对象实例时由当前用户人工定义职能岗位的读写权限;访问/操作对象实例时将实例的职能岗位配置与session[:duty_ids]进行比较,确定权限。具体实现方法不再赘述。

需要注意,职能岗位是不定项选择,可以不选,也可以多选;在设计属性结构和检查算法时需要考虑这一点。

5 结论

该方案能够实现粗粒度和细粒度相结合的权限控制,具有高自由度、高扩展性等特点;且能适应未来一定时间内组织机构变革的发展需求;可以满足大多数业务信息系统权限控制的要求。

参考文献:

[1] 张晓辉,王培康. 大型信息系统用户权限管理[J].计算机应用,2000年11月,第20卷第11期:35页

[2] 李海洋,杨丽娜. 科层职能式企业组织结构研究[J].合作经济与科技,2012年10月号上,总第450期:50页

猜你喜欢

字典实例控制器
南京溧水电子3款控制器产品
水泥生料立磨压差变参数二型模糊控制器设计
字典的由来
基于NFV的分布式SDN控制器节能机制
大头熊的字典
正版字典
完形填空Ⅱ
完形填空Ⅰ
智能液位控制器在排水系统中的应用