1 背景
访问控制(Access Control)是按照用户的身份及其所归属的某项定义组来限制用户对某些信息的访问,或者限制对某些控制功能使用的一种技术。访问控制在身份认证环节之后,根据该身份提出的资源请求加以控制。
现有的用户权限管理方法有自主访问控制(discretionaryaccess control,DAC),强制访问控制(mandatory access control,MAC)和基于角色的访问控制(role-based access control,RBAC)[1]。目前行业对RBAC 模型的研究聚焦于模型的扩展以及改进、信息系统应用方面。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。其中,权限是指针对信息系统的操作权力,权限赋予角色,角色分配给用户。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。其授权模型如图l所示。
RBAC模型在应用于高校内部财务结转系统过程中,在角色和用户权限中分别设置优先级约束和继承约束避免了权限冲突[2],然而对于个别用户身兼多职,并且在不同的部门承担同一职位,例如一位用户既是高校二级学院院长,又是高校教务处处长,同时还是教材审批领导,其中院长和教务处处长的角色在系统中使用的功能操作栏相同,那么对该用户进行角色权限分配后,用户一旦登录系统进入功能栏时,应用RBAC模型分配的访问控制权限此时会出现数据错误,因为承担不同部门的同一职位在系统中获取到的数据并不相同。在此背景下,针对拥有多重角色(院长和教务处处长在系统中的角色名称均为用户部门领导)的用户,本文对RABC模型进行扩展,在不影响其他用户的前提下,实现了一种解决多重角色用户访问权限控制的方法。
2 基于多重角色的权限控制
2.1 权限控制的设计思想
在许多应用系统中,都存在一部分用户身兼多职,并且跨部门供职,这部分用户会出现承担多个部门的同一角色,这种情况下,一个用户的部门信息有多个,多个部门对应一个角色,或者多个角色。直接应用RBAC模型,在应用系统中对不同角色对应不同可见性,那么身兼多个部门职位的用户在使用系统过程中就会因为多个部门对应同一角色的原因出现数据错误的问题,鉴于此,基于多重角色的权限控制是在RBAC模型的基础上增加了为角色分配用户所属部门信息,便于对用户进行管理和角色分配时具体到一个角色对应一个部门。从而RBAC模型中的为用户分配角色就转化为用户分配角色和角色对应的部门,用户所拥有权限是为其分配所有的角色对应权限的集合,这种模式在应对各种身兼多职的情况时,具有很强的授权灵活性。
对于开发基于B/S架构的Web信息系统,实质上是在开发、积累功能模块,每个功能模块都对应一些具有特定功能的页面文件,因此用户权限和页面是相联系的。设计实例时,先为用户分配角色,每个角色对应一些可操作的功能模块,即权限,分配角色时即为用户分配该角色对应的部门信息,在用户登录时依据用户名获得其对应的角色信息,依据角色展示给用户相应的操作栏。
3 基于多重角色的权限控制研究实例
3.1 多重角色的分配
实例中由管理员为身兼多职的用户分配多重角色,分配角
色时选择该角色对应用户所属部门,主要代码如下:
.............
UserRole userRole=null;
userRole=new UserRole(role_id,user_id,priority,bumen_id);
if(userRoleService.save(userRole)==true){
}else{
ajaxResult = AJAXUtil.newOk(分配权限失败!
}
.......
多重角色用户登录系统时,根据用户角色数据查询每一角
色对应的部门信息,主要代码如下:
@Override
public List getUserRoles(Long id) {
UserRoleDAO userRoleDao = new UserRoleDAO();
List userRoles = userRoleDao
.getUserRoles(id);
RoleDAO roleDao=new RoleDAO();
BumenDAO bumenDao=new BumenDAO();
Long bumen_id;
Long role_id;
for (UserRole userRole:userRoles) {
role_id=userRole.getRole_id();
userRole.setRole(roleDao.get(role_id));
}
//多重角色:查找与角色对应的部门信息。
for (UserRole userRole:userRoles) {
bumen_id=userRole.getBumen_id(); user ⁃
Role.setBumen(bumenDao.get(bumen_id));
}
return userRoles;
}
.............
角色名称
优先级(数值越小,优先级越高)
角色对应部门
${item.role.name td
${item.priority}
${item.bumen.bmname}
.......
3.2 生成用户界面
用户登录后验证其合法性,权限控制系统根据用户编号从系统中读取出其对应的角色信息,再根据每个角色对应的权限为用户展示出可操作的权限集合,即功能栏。如图3中左侧的部分功能栏是给用户可操作的模块,每个子模块对应链接页,面不同权限的用户登录后的功能栏也不同。
3.3 权限控制
1)为角色添加权限
系统实例中创建了很多功能模块,每一个新增角色都是若干个功能模块根据业务逻辑需要的自由组合,新增角色时,系统为管理员用户提供了一个树形视图,能够非常方便地选择功能模块
2)多重角色用户
对于具有多重角色的用户,分配角色时增加一个部门信息,在用户访问具体的功能模块时可根据角色对应的部门信息获取数据,具有非常强的灵活性。
4 结束语
基于B/S架构的Web应用系统,对于安全性方面的要求非常高,因此,本文针对企业、校园中个人身兼多职的情况,结合Jsp技术以及Web应用框架Struts解决了多重角色用户的访问控制,无需根据职务切换视图,处理工作流畅高效。本文提出的方案已在一个项目中应用,运行状况良好。