权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。
从控制力度来看,可以将权限管理分为两大类:
1,功能级权限管理;
2,数据级权限管理。
从控制方向来看,也可以将权限管理分为两大类:
1,从系统获取数据,比如查询订单、查询客户资料;
2,向系统提交数据,比如删除订单、修改客户资料
数据权限是在功能权限的基础上面进一步的扩展,比如可以查看订单这个视图(页面)属于功能权限的范围,但是可以查看这个视图中的哪些订单就是数据权限的工作了。
由于目前功能权限设计已经很成熟了,因此本博客不再讨论在功能模块上如何进行权限管理,而是讨论如何实现在数据级的权限管理,这里就涉及到,用户向系统提交数据,系统同数据库之间进行数据交流时的操作。
数据权限规则用来过滤用户在某条数据上的权限。即约束用户对具体的数据的操作权限,此约束包含:不可修改、不可删除、不可查看、不可修改。
考虑到数据级权限管理需要大量维护数据约束条件,因此在web页面中需要进行复杂的数据规则条件的约束的完成,后台数据也需要进行复杂的数据规则权限的封装和解析。就与以上原因,在本系统中处理复杂数据拼接封装、解析时将大量、普遍使用JSON对象处理。
数据规则的设计初衷是为了达到针对不同用户组的用户,过滤特定数据的目的。在过滤显示时,数据规则采用的是针对通用的HQL查询出来的结果集进行过滤,加载用户配置好的数据规则,过滤结果集中对象的关键字段,并将过滤后的结果返回;在约束用户的不可修改、不可删除、不可新增的权限时,采用的是拦截用户需要进行操作的对象或在页面上已经操作过的对象,加载用户已经配置好的数据规则,进行关键字匹配,返回一个boolean变量,来决定是否让用户进行这些操作。
在本系统中,数据规则主要包含两个大的部分:规则封装、规则解析。规则封装是提供给高级用户自定义数据规则的过程,在此过程中,高级用户可以根据自己的意愿来决定哪些用户对哪些数据具有操作的权限,同时将高级用户封装好的规则存入数据库中。规则解析是将高级用户封装的规则解析、加载、并作用到系统中的普通用户的过程,在此过程中,用户在页面上浏览到的数据、或者要操作的数据都经过了数据规则的处理。
数据库模型:ZCPLT_PVG
实体类:DataVPvgRole.java
配置文件:DataPvgRole.hbm.xml
DataPvgRoleDao.java
TableDao.java
DataPvgRoleManager.java
PvgTypeEditManager.java
dataPvgRuleManager.xhtml
pvgRoleEdit.xhtml
inputEdit.js
pvgCondition.js
util.js
PvgDataRoleUtil.java
ObjectFilter.java
newPvg():此方法将打开一个新的浮窗页面,进行规则的编辑
EditorPvg():此方法将打开新的浮窗页面,进行规则的重构。
Delect():此方法将会批量删除一批规则。
mergeVal():此方法为javascript方法,此方法会调用后台的方法merge(),将会临时存储用户建立的规则。
commitPvgContent():此方法将会将在此页面中创建的数据规则封装成实体类对象,并将此对象返回给主页面中的bean类,处理。
提交的数据规则中的具体的Json对象内容如下:
[ { "condition": [ { "values": [ "a", " b", " f", " fg", " 业务模块测试" ], "pro": "templateName", "connector": "not in" } ], "className": "AdvanceQuery" }, { "condition": [ { "values": [ "a", " b", " f", " fg", " 测试", " Boss" ], "pro": "usrName", "connector": "in" } ], "className": "User" } ]
在系统中如果想要加载数据规则,需要开发人员主动将数据规则方法加入到开发业务逻辑中,加载数据规则时要在PvgDataRoleUtil类中调用相应的方法。具体的方法如下:
queryFilter(List list):拦截在数据库中查询到的数据对象,并加载数据权限规则(如上json),过滤结果集后返回一个List集合。
DecodingAddSql(Object object):拦截需要新增的对象,加载数据规则,匹配拦截对象的关键字,返回boolean值,决定是否允许用户新增。
decodeUpdateSql(Object object):拦截需要修改的对象或者用户在页面上已经修改过的对象,加载数据规则,匹配拦截对象的关键字,返回boolean值,决定是否允许用户进行修改操作或是否允许用户将有个字段修改为某个字符串。
decodingDeleteSql(Object object):拦截需要删除的对象,加载数据规则,匹配拦截对象的关键字,返回boolean值,决定是否允许用户删除。
List<AdvanceQuery> list = PvgDataRoleUtil.queryFilter(advanceQueryDao.findAll());
boolean flag = PvgDataRoleUtil.decodingAddSql(advanceQuery); if(true == flag ){ //不可新增 System.out.println("不可新增"); //返回页面提示信息 }else{ advanceQueryDao.save(advanceQuery); }
boolean flag = PvgDataRoleUtil.decodingUpdateSql (advanceQuery); if(true == flag ){ //不可修改 System.out.println("不可修改"); //返回页面提示信息 }else{ advanceQueryDao.update(advanceQuery); }
boolean flag = PvgDataRoleUtil. decodingDeleteSql (advanceQuery); if(true == flag ){ //不可删除 System.out.println("不可删除"); //返回页面提示信息 }else{ advanceQueryDao. delete (advanceQuery); }
图 1 数据权限管理界面
图 2 数据权限配置界面