jeecg权限设计的介绍之数据权限

来源:互联网 发布:星光大道网络报名 编辑:程序博客网 时间:2024/05/29 09:39

1、 基本概念

上次我们说个一个用户从部门,角色,菜单资源,按钮权限的设计,那么出现这样一个场景。

A和B同时属于,某个部分销售经理,A负责北京的销售,B负责上海的销售。那么当A打开西系统的时候看到的就应该是北京的销售数据,B看到是上海的销售数据。

这样的业务情景。在同样的情景下,jeecg也能用规则区分出来,那就是数据权限。

2、数据权限的实现

2.1 jeecg 的页面实现

新建一个用户
这里写图片描述
这个用户是角色是普通职员,下面新建一个菜单资源,
这里写图片描述
并且赋值上数据权限
这里写图片描述
给这个角色配置资源菜单和数据权限
这里写图片描述
那么用你就会发现 ,刚刚我们配置的菜单资源上的规则。不用的部门的资料真的看不见了
这里写图片描述
那么下面就说说jeecg 数据权限是怎么实现的

2.1 jeecg 代码实现

jeecg 其实就只应用一张表

create table jeecg.t_s_data_rule(   id                   national varchar(96),   rule_name            national varchar(96),   rule_column          national varchar(300),   rule_conditions      national varchar(300),   rule_value           national varchar(300),   create_date          datetime,   create_by            national varchar(96),   create_name          national varchar(96),   update_date          datetime,   update_by            national varchar(96),   update_name          national varchar(96),   functionId           national varchar(96));

大家都听说的sql 注入。这个数据规则的实现就是根据这个原理就是在数据查询的时候 拼接上自动的sql

where 所属机构=’xxxxxxx’

每当jeecg访问菜单的时候都会经过jeecg自定义的拦截器

/jeecgT/src/org/jeecgframework/core/interceptors/AuthInterceptor.java

Set<String> dataruleCodes =                          systemService.getOperationCodesByUserIdAndDataId(client.getUser().getId(),            functionId);                    request.setAttribute("dataRulecodes", dataruleCodes);                    for (String dataRuleId : dataruleCodes) {                        TSDataRule dataRule = systemService.getEntity(TSDataRule.class, dataRuleId);    MENU_DATA_AUTHOR_RULES.add(dataRule);    MENU_DATA_AUTHOR_RULE_SQL += SysContextSqlConvert.setSqlModel(dataRule);}

但拦截器发现我们定义的菜单有 数据规则权限的时候,他就会根据 functionId 去寻找 数据权限这个表中的数据,然后把 这个表中定义的数据翻译成sql 语句 下面我是debug模式下的截图
这里写图片描述
那么他就会很明显的 格式化数据权限表的我们的定义的sql ,查询数据的结果就会过滤出来了。那么就试下不同部门看到了不同的数据。
那么很明显,需要规则的字段必须是 查询表中的有的 例如 JeecgDemo.depId 肯定是上下文中找到的部门id
jeecg 规则如下

参数说明:规则字段 查询模式采用 HIbernate方式,该字段为实体的字段,例如: createBy查询模式采用 Minidao方式,该字段为表的字段,例如: create_by条件控制 匹配方式进行选择规则值 固定值或者系统上下文变量系统上下文变量采用 #{?}格式系统标准上下文变量参考:    sys_company_code 当前登录用户公司编号    sys_org_code 当前登录用户部门编号    sys_user_code 当前登录用户账号(对应系统用户账户例如: admin)    sys_user_name  当前用户真实名称    sys_date 当前日期    sys_time 当前时间

3、总结

jeecg 在角色上做了权限的控制,现在又在 数据层上做了规则的设置,将来也有可能对权限继续细化,会在表的字段做 “字段权限 ”的设置。这是后话。现在大家都jeecg权限估计有了一个大致的了解了吧。以后会更细节讲解jeecg权限问题。

0 0