根据系统需求,我们从几个维度对角色分类:第一个维度是在用户的角色维护上,直接对用户进行角色分配,或当用户和项目发生调动关系时,动态的维护用户的角色;第二个维度是是否属于公司职位,或系统维护类;第三个维度是是否可以直接调剂到项目开发中的研发类角色。对于权限,从抽象到具体划分为菜单->制度->(区域->按钮),我们在权限管理中可以为角色配置菜单,区域或按钮;在制度管理中,创建制度时可以指定查看的角色;在web页面中可以通过IMS标签控制区域或按钮。
角色分类
静态角色分类
职位类
管理类职位
研发类职位
系统类
系统管理员
日志管理员
动态角色分类
项目经理
项目组成员
权限划分
菜单
制度
区域或按钮
权限编码
对权限的编码主要涉及菜单,区域或按钮的编码,这种编码明显带有上下级关系;制度权限编码依赖于制度详细信息中的主键,不具有上下级关系。目前采用Excel文件作为数据字典方便菜单和按钮与角色分配管理。当文件改变之后,可以运行初始化菜单程序以更新菜单。初始化时机由系统自定义,可以使用调度框架或Spring容器生命周期,目前嵌入到Spring生命周期中。菜单初始化算法如下:
假设有集合:menuNames存放菜单名,tops存放顶级菜单名;Map:weights存放菜单名与对应的菜单编号,临时变量base
前置条件:1.菜单不能重名 2.顶级菜单项不能大于(1-9)9, 同级子菜单项不能大(0-9)10。
后置条件:weights集合存放了所有的菜单和编号
从”menu” Sheet第二行从左到右扫描
对于最左项,如果menuNames中不存在,则将菜单名放入tops,并将菜单名和Top数量放入weights;记录top数量到base
如果存在,从weight中根据菜单名得到编号并放入到base
向右扫描,迭代每一项
如果项值为空,退出
weights中放入菜单名,菜单编号为10 * base + 菜单在excel中列编号;menuNames中放入菜单名
通过上述算法的描述,可以了解到菜单的编码,如果编号为1 的菜单为“我的工作台”,12是“项目管理”,则“我的工作台”和“项目管理”具有上下级关系,而且“项目管理”是“我的工作台”的第三个儿子。通过这种数据结构容易制定菜单。至于按钮的编码或角色分配如之类似。
1.rolesKey
用户、角色、权限之间表现为多对多关系,我们为用户,权限设计一个rolesKey属性,它是long类型的位向量,每一位表示以为角色,位与角色主键相关,这样可最多表示64个角色,目前系统存在40个角色,rolesKey可胜任,rolesKey好处在于位运算效率高,基于位向量的代码比较紧凑,而且扩展性强。一般在角色实体中定义常用的角色变量和方法就可满足大多数需求。我们在hibernate为用户和权限设置角色的时候,计算rolesKey。这个过程对开发人员透明。
2.权限控制标签
ims标签是基于角色的权限控制标签,它提供三个属性
sessionFactoryBeanName 可选,自定义权限Tag中查询角色等表需要的
roles 可选,以”,”分隔的角色id列表,指定哪些角色可以访问该标签
accessKey 必选,区域或按钮权限编号
目前提供<ims:button accessKey=”3012”/> <ims:div accessKey=”3013”></ims:div>(freemarker定制)
角色分类
静态角色分类
职位类
管理类职位
研发类职位
系统类
系统管理员
日志管理员
动态角色分类
项目经理
项目组成员
权限划分
菜单
制度
区域或按钮
权限编码
对权限的编码主要涉及菜单,区域或按钮的编码,这种编码明显带有上下级关系;制度权限编码依赖于制度详细信息中的主键,不具有上下级关系。目前采用Excel文件作为数据字典方便菜单和按钮与角色分配管理。当文件改变之后,可以运行初始化菜单程序以更新菜单。初始化时机由系统自定义,可以使用调度框架或Spring容器生命周期,目前嵌入到Spring生命周期中。菜单初始化算法如下:
假设有集合:menuNames存放菜单名,tops存放顶级菜单名;Map:weights存放菜单名与对应的菜单编号,临时变量base
前置条件:1.菜单不能重名 2.顶级菜单项不能大于(1-9)9, 同级子菜单项不能大(0-9)10。
后置条件:weights集合存放了所有的菜单和编号
从”menu” Sheet第二行从左到右扫描
对于最左项,如果menuNames中不存在,则将菜单名放入tops,并将菜单名和Top数量放入weights;记录top数量到base
如果存在,从weight中根据菜单名得到编号并放入到base
向右扫描,迭代每一项
如果项值为空,退出
weights中放入菜单名,菜单编号为10 * base + 菜单在excel中列编号;menuNames中放入菜单名
通过上述算法的描述,可以了解到菜单的编码,如果编号为1 的菜单为“我的工作台”,12是“项目管理”,则“我的工作台”和“项目管理”具有上下级关系,而且“项目管理”是“我的工作台”的第三个儿子。通过这种数据结构容易制定菜单。至于按钮的编码或角色分配如之类似。
1.rolesKey
用户、角色、权限之间表现为多对多关系,我们为用户,权限设计一个rolesKey属性,它是long类型的位向量,每一位表示以为角色,位与角色主键相关,这样可最多表示64个角色,目前系统存在40个角色,rolesKey可胜任,rolesKey好处在于位运算效率高,基于位向量的代码比较紧凑,而且扩展性强。一般在角色实体中定义常用的角色变量和方法就可满足大多数需求。我们在hibernate为用户和权限设置角色的时候,计算rolesKey。这个过程对开发人员透明。
2.权限控制标签
ims标签是基于角色的权限控制标签,它提供三个属性
sessionFactoryBeanName 可选,自定义权限Tag中查询角色等表需要的
roles 可选,以”,”分隔的角色id列表,指定哪些角色可以访问该标签
accessKey 必选,区域或按钮权限编号
目前提供<ims:button accessKey=”3012”/> <ims:div accessKey=”3013”></ims:div>(freemarker定制)