关注JEECG发展历程 关注最新动态和版本, 记录JEECG成长点滴 更新日志 - 技术支持 - 招聘英才

JEECG最新版本下载 JEECG智能开发平台 - 显著提高开发效率 常见问题 - 入门视频 - 参与开源团队

商务QQ: 69893005、3102411850 商务热线(5*8小时): 010-64808099 官方邮箱: jeecgos@163.com

查看: 5151|回复: 1

自定义报表权限问题

[复制链接]
发表于 2017-11-20 13:49:20 | 显示全部楼层 |阅读模式
目前系统虽然支持报表权限控制,但是不同的报表  控制权限无法进行区分  比如报表1  字段A=1   报表2 字段B=2  由于报表权限菜单地址都一样  
cgReportController.do?datagrid    导致查询报表1时,会同时加载权限控制
字段A=1 和字段B=2 的条件  导致无法查询
 楼主| 发表于 2017-11-20 14:09:52 | 显示全部楼层
不好意思,上述问题描述不怎么正确,原系统不支持报表数据权限,我自己增加了权限控制代码,  
整个报表数据权限控制如下
在菜单权限注册  菜单地址cgReportController.do?datagrid 后面增加参数
例如:cgReportController.do?datagrid&id=ic_flow  
在CgReportController增加方法preHandle(修改参考表单数据权限控制代码)如下
        /**
         * 在controller前拦截
         */
        public String preHandle(HttpServletRequest request, HttpServletResponse response,String configId) throws Exception {

                String requestPath = ResourceUtil.getRequestPath(request);// 用户访问的资源地址
                Client client = ClientManager.getInstance().getClient(ContextHolderUtils.getSession().getId());
                TSUser currLoginUser = client != null ? client.getUser() : null;

                // 解决rest风格下 权限失效问题
                String functionId = "";
//                String uri = request.getRequestURI().substring(request.getContextPath().length() + 1);

                List<TSFunction> functions = systemService.findByProperty(TSFunction.class, "functionUrl", requestPath+"&id="+configId+"");
                if (functions.size() > 0) {
                        functionId = functions.get(0).getId();
                }

                // Step.1 第一部分处理页面表单和列表的页面控件权限(页面表单字段+页面按钮等控件)
                if (!oConvertUtils.isEmpty(functionId)) {

                        if (!currLoginUser.getUserName().equals("admin")) {
                                // 获取菜单对应的页面控制权限(包括表单字段和操作按钮)

                                List<TSOperation> operations = systemService.getOperationsByUserIdAndFunctionId(currLoginUser.getId(),
                                                functionId);
                                request.setAttribute(Globals.NOAUTO_OPERATIONCODES, operations);
                                if (operations == null) {
                                        request.setAttribute(Globals.OPERATIONCODES, null);
                                } else {
                                        Set<String> operationCodes = new HashSet<String>();
                                        for (TSOperation operation : operations) {
                                                operationCodes.add(operation.getId());
                                        }
                                        request.setAttribute(Globals.OPERATIONCODES, operationCodes);
                                }
                        }

                        // Step.2 第二部分处理列表数据级权限 (菜单数据规则集合)
                        List<TSDataRule> MENU_DATA_AUTHOR_RULES = new ArrayList<TSDataRule>();
                        String MENU_DATA_AUTHOR_RULE_SQL = "";

                        // 数据权限规则的查询
                        // 查询所有的当前这个用户所对应的角色和菜单的datarule的数据规则id

                        if (!currLoginUser.getUserName().equals("admin")) {
                                // Globals.BUTTON_AUTHORITY_CHECK
                                Set<String> dataruleCodes = systemService.getOperationCodesByUserIdAndDataId(currLoginUser.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);
                                }
                        }
                        return MENU_DATA_AUTHOR_RULE_SQL;
                }
                return null;

        }



然后在datagrid方法引入上述方法 其中红色部分是我增加的
位置:
if (paramList != null && paramList.size() > 0) {
                        for (String param : paramList) {
                                String value = request.getParameter(param);
                                value = value == null ? "" : value;
                                querySql = querySql.replace("${" + param + "}", value);
                        }
                } else {
                        for (Map<String, Object> item : items) {
                                String isQuery = (String) item.get(CgReportConstant.ITEM_ISQUERY);
                                if (CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)) {
                                        // step.3 装载查询条件
                                        CgReportQueryParamUtil.loadQueryParams(request, item, queryparams);
                                }
                        }

                        try {
                                String wherestr=preHandle(request, response,configId);
                                if(wherestr!=null&&wherestr.length()>0){
                                        querySql=querySql+wherestr;
                                }
                        } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                                throw new BusinessException(e.getMessage());
                        }
                }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表