|
楼主 |
发表于 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());
}
}
|
|