chaohai 发表于 2017-11-20 13:49:20

自定义报表权限问题

目前系统虽然支持报表权限控制,但是不同的报表控制权限无法进行区分比如报表1字段A=1   报表2 字段B=2由于报表权限菜单地址都一样

cgReportController.do?datagrid    导致查询报表1时,会同时加载权限控制

字段A=1 和字段B=2 的条件导致无法查询

chaohai 发表于 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());
                        }
                }
页: [1]
查看完整版本: 自定义报表权限问题