[关闭]
@zh350229319 2017-11-15T06:49:32.000000Z 字数 3192 阅读 432

数据权限使用说明

公司框架


数据权限要求拥有搜索(个人)权限时,只能查看创建人为当前用户的数据;拥有搜索(组织)权限时,只能查看当前组织的数据,不包括子组织;拥有搜索(企业)权限时,可以查看当前企业下所有组织的数据。
同时拥有多个查询权限只显示一个,优先级企业>组织>个人
以PSS的盘订单为例子,修改流程如下

数据库改动

权限数据

在OA菜单中新增三个查询权限,例如:pssOrderDisk:findEnt为搜索(企业),pssOrderDisk:findOrg为搜索(组织),原有的pssOrderDisk:find改为搜索(个人),对应的sql如下

  1. INSERT INTO `580oa`.`ucs_system_permission` (`id`, `name`, `pid`, `app_id`, `type`, `url`, `description`, `status`, `sort`, `is_top`) VALUES ('67d4c0cfe9b54cd1b9c77c366ec52177', '搜索(企业)', 'a25cee43b32e11e78a03005056a84541', '3dfc595ab00211e78a03005056a84541', '02', 'pssOrderDisk:findEnt', '', '01', '0', '0');
  2. INSERT INTO `580oa`.`ucs_system_permission` (`id`, `name`, `pid`, `app_id`, `type`, `url`, `description`, `status`, `sort`, `is_top`) VALUES ('88f14bdced4e4268b4dab5b1162f4a50', '搜索(组织)', 'a25cee43b32e11e78a03005056a84541', '3dfc595ab00211e78a03005056a84541', '02', 'pssOrderDisk:findOrg', '', '01', '0', '0');
  3. UPDATE `580oa`.`ucs_system_permission` SET `name`='搜索(个人)', `description`='' WHERE `id`='96a640fcb3d911e78a03005056a84541';

数据表新增组织和企业字段

在需要实现数据权限的表中新增ent_id(企业id)、org_id(组织id)和creator_id(创建人),字段名建议按照此命名规范来实行。如果已有可不修改。
新增数据时将当前用户的id、组织id和企业id写入对应字段,当前用户信息使用UserUtil.getCurrentShiroUser()可获取到
(可选)0为了不造成数据异常,在修改数据库字段后,可以执行批量更新将新增的字段赋值。用户id、组织id和企业id都可以赋值'00000000000000000000000000000000',sql例子如下。

  1. SET SQL_SAFE_UPDATES=0;
  2. -- 更新原有订单数据
  3. update pss_order_disk set ent_id='00000000000000000000000000000000';

实现效果

最终效果为当用户拥有搜索(企业)权限时,办事处初始化为当前企业的组织数据,办事处人员为空。后台查询时自动加上企业id查询条件;
当用户为组织权限时,可以查看用户当前组织的数据,办事处只读不可选择,销售人员下拉菜单初始化为当前组织人员。后台查询时自动加上组织id查询条件
当用户为个人权限时,可以查看个人的数据,办事处和销售人员查询框为只读,后台在查询中自动加上创建人ID和企业id查询条件;

controller

  1. /**
  2. * 主列表中查询
  3. * @dzmgenerated 2017-10-18 13:06:15
  4. * @return
  5. */
  6. @RequiresPermissions({"pssOrderDisk:find","pssOrderDisk:findOrg","pssOrderDisk:findEnt"})
  7. @RequestMapping(value = "find", method = RequestMethod.POST)
  8. @ResponseBody
  9. public Map<String,Object> find(HttpServletRequest request){
  10. List<Condition> conditions = Condition.buildFromHttpRequest(request);
  11. Subject subject = SecurityUtils.getSubject();
  12. if(subject.isPermitted("pssOrderDisk:findEnt")) {
  13. conditions.add(new Condition("eqs_entId__PssOrderDiskExample", UserUtil.getCurrentShiroUser().getEnt().getId()));
  14. } else if(subject.isPermitted("pssOrderDisk:findOrg")) {
  15. conditions.add(new Condition("eqs_orgId__PssOrderDiskExample", UserUtil.getCurrentShiroUser().getOrg().getId()));
  16. } else if(subject.isPermitted("pssOrderDisk:find")) {
  17. conditions.add(new Condition("eqs_orgId__PssOrderDiskExample", UserUtil.getCurrentShiroUser().getOrg().getId()));
  18. conditions.add(new Condition("eqs_creatorId__PssOrderDiskExample", UserUtil.getCurrentShiroUser().getId()));
  19. }
  20. Page Page = new Page(request);
  21. MybatisExample mybatisExample = MybatisExample.getInstance();
  22. PssOrderDiskCustomerComplexExample example = (PssOrderDiskCustomerComplexExample)mybatisExample.buildExampleByCondition(conditions,
  23. Page.getRows()==0?null:Page,
  24. PssOrderDiskCustomerComplexExample.class.getName());
  25. PageList<PssOrderDiskDto> list = pssOrderDiskService.selectOrderListComplex(example,
  26. Page.getRows()==0?new PageBounds():new PageBounds(Page.getPage(),Page.getRows()));
  27. return getEasyUIGrid(list);
  28. }

前台shiro标签控制,支持or and not 关键词 不支持and or混用,参考http://jinnianshilongnian.iteye.com/blog/1864800

  1. <shiro:hasPermission name="pssOrderDisk:find and not pssOrderDisk:findOrg and not pssOrderDisk:findEnt">readonly</shiro:hasPermission>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注