소스 검색

GLUE代码越权控制

xuxueli 6 년 전
부모
커밋
9329fb39e7

+ 1 - 1
doc/XXL-JOB官方文档.md 파일 보기

1483
     - 触发:单节点周期性触发,运行事件如delayqueue;
1483
     - 触发:单节点周期性触发,运行事件如delayqueue;
1484
     - 调度:集群竞争,负载方式协同处理,竞争-加入时间轮-释放-竞争;
1484
     - 调度:集群竞争,负载方式协同处理,竞争-加入时间轮-释放-竞争;
1485
 - 2、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
1485
 - 2、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
1486
-- 3、权限管理:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;([规划中]任务、日志,执行器,均限制权限;)
1486
+- 3、权限管理:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
1487
 - 4、调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1487
 - 4、调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1488
 - 5、调度线程池参数调优;
1488
 - 5、调度线程池参数调优;
1489
 - 6、升级xxl-rpc至较新版本,并清理冗余POM;
1489
 - 6、升级xxl-rpc至较新版本,并清理冗余POM;

+ 11 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java 파일 보기

1
 package com.xxl.job.admin.controller;
1
 package com.xxl.job.admin.controller;
2
 
2
 
3
+import com.xxl.job.admin.core.exception.XxlJobException;
3
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
5
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
6
+import com.xxl.job.admin.core.model.XxlJobUser;
5
 import com.xxl.job.admin.core.util.I18nUtil;
7
 import com.xxl.job.admin.core.util.I18nUtil;
6
 import com.xxl.job.admin.dao.XxlJobInfoDao;
8
 import com.xxl.job.admin.dao.XxlJobInfoDao;
7
 import com.xxl.job.admin.dao.XxlJobLogGlueDao;
9
 import com.xxl.job.admin.dao.XxlJobLogGlueDao;
10
+import com.xxl.job.admin.service.LoginService;
8
 import com.xxl.job.core.biz.model.ReturnT;
11
 import com.xxl.job.core.biz.model.ReturnT;
9
 import com.xxl.job.core.glue.GlueTypeEnum;
12
 import com.xxl.job.core.glue.GlueTypeEnum;
10
 import org.springframework.stereotype.Controller;
13
 import org.springframework.stereotype.Controller;
13
 import org.springframework.web.bind.annotation.ResponseBody;
16
 import org.springframework.web.bind.annotation.ResponseBody;
14
 
17
 
15
 import javax.annotation.Resource;
18
 import javax.annotation.Resource;
19
+import javax.servlet.http.HttpServletRequest;
16
 import java.util.Date;
20
 import java.util.Date;
17
 import java.util.List;
21
 import java.util.List;
18
 
22
 
30
 	private XxlJobLogGlueDao xxlJobLogGlueDao;
34
 	private XxlJobLogGlueDao xxlJobLogGlueDao;
31
 
35
 
32
 	@RequestMapping
36
 	@RequestMapping
33
-	public String index(Model model, int jobId) {
37
+	public String index(HttpServletRequest request, Model model, int jobId) {
34
 		XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
38
 		XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
35
 		List<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
39
 		List<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
36
 
40
 
41
 			throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid"));
45
 			throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid"));
42
 		}
46
 		}
43
 
47
 
48
+		// valid permission
49
+		XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
50
+		if (!loginUser.validPermission(jobInfo.getJobGroup())) {
51
+			throw new XxlJobException(I18nUtil.getString("system_permission_limit"));
52
+		}
53
+
44
 		// Glue类型-字典
54
 		// Glue类型-字典
45
 		model.addAttribute("GlueTypeEnum", GlueTypeEnum.values());
55
 		model.addAttribute("GlueTypeEnum", GlueTypeEnum.values());
46
 
56
 

+ 13 - 9
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java 파일 보기

16
 import com.xxl.job.core.glue.GlueTypeEnum;
16
 import com.xxl.job.core.glue.GlueTypeEnum;
17
 import org.springframework.stereotype.Controller;
17
 import org.springframework.stereotype.Controller;
18
 import org.springframework.ui.Model;
18
 import org.springframework.ui.Model;
19
-import org.springframework.util.StringUtils;
20
 import org.springframework.web.bind.annotation.RequestMapping;
19
 import org.springframework.web.bind.annotation.RequestMapping;
21
 import org.springframework.web.bind.annotation.RequestParam;
20
 import org.springframework.web.bind.annotation.RequestParam;
22
 import org.springframework.web.bind.annotation.ResponseBody;
21
 import org.springframework.web.bind.annotation.ResponseBody;
53
 		List<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();
52
 		List<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();
54
 
53
 
55
 		// filter group
54
 		// filter group
55
+		List<XxlJobGroup> jobGroupList = filterJobGroupByRole(request, jobGroupList_all);
56
+		if (jobGroupList==null || jobGroupList.size()==0) {
57
+			throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
58
+		}
59
+
60
+		model.addAttribute("JobGroupList", jobGroupList);
61
+		model.addAttribute("jobGroup", jobGroup);
62
+
63
+		return "jobinfo/jobinfo.index";
64
+	}
65
+
66
+	public static List<XxlJobGroup> filterJobGroupByRole(HttpServletRequest request, List<XxlJobGroup> jobGroupList_all){
56
 		List<XxlJobGroup> jobGroupList = new ArrayList<>();
67
 		List<XxlJobGroup> jobGroupList = new ArrayList<>();
57
 		if (jobGroupList_all!=null && jobGroupList_all.size()>0) {
68
 		if (jobGroupList_all!=null && jobGroupList_all.size()>0) {
58
 			XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
69
 			XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
70
 				}
81
 				}
71
 			}
82
 			}
72
 		}
83
 		}
73
-		if (jobGroupList==null || jobGroupList.size()==0) {
74
-			throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
75
-		}
76
-
77
-		model.addAttribute("JobGroupList", jobGroupList);
78
-		model.addAttribute("jobGroup", jobGroup);
79
-
80
-		return "jobinfo/jobinfo.index";
84
+		return jobGroupList;
81
 	}
85
 	}
82
 	
86
 	
83
 	@RequestMapping("/pageList")
87
 	@RequestMapping("/pageList")

+ 5 - 21
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java 파일 보기

4
 import com.xxl.job.admin.core.model.XxlJobGroup;
4
 import com.xxl.job.admin.core.model.XxlJobGroup;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.model.XxlJobLog;
6
 import com.xxl.job.admin.core.model.XxlJobLog;
7
-import com.xxl.job.admin.core.model.XxlJobUser;
8
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
9
 import com.xxl.job.admin.core.util.I18nUtil;
8
 import com.xxl.job.admin.core.util.I18nUtil;
10
 import com.xxl.job.admin.dao.XxlJobGroupDao;
9
 import com.xxl.job.admin.dao.XxlJobGroupDao;
11
 import com.xxl.job.admin.dao.XxlJobInfoDao;
10
 import com.xxl.job.admin.dao.XxlJobInfoDao;
12
 import com.xxl.job.admin.dao.XxlJobLogDao;
11
 import com.xxl.job.admin.dao.XxlJobLogDao;
13
-import com.xxl.job.admin.service.LoginService;
14
 import com.xxl.job.core.biz.ExecutorBiz;
12
 import com.xxl.job.core.biz.ExecutorBiz;
15
 import com.xxl.job.core.biz.model.LogResult;
13
 import com.xxl.job.core.biz.model.LogResult;
16
 import com.xxl.job.core.biz.model.ReturnT;
14
 import com.xxl.job.core.biz.model.ReturnT;
25
 
23
 
26
 import javax.annotation.Resource;
24
 import javax.annotation.Resource;
27
 import javax.servlet.http.HttpServletRequest;
25
 import javax.servlet.http.HttpServletRequest;
28
-import java.text.ParseException;
29
-import java.util.*;
26
+import java.util.Date;
27
+import java.util.HashMap;
28
+import java.util.List;
29
+import java.util.Map;
30
 
30
 
31
 /**
31
 /**
32
  * index controller
32
  * index controller
51
 		List<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();
51
 		List<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();
52
 
52
 
53
 		// filter group
53
 		// filter group
54
-		List<XxlJobGroup> jobGroupList = new ArrayList<>();
55
-		if (jobGroupList_all!=null && jobGroupList_all.size()>0) {
56
-			XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
57
-			if (loginUser.getRole() == 1) {
58
-				jobGroupList = jobGroupList_all;
59
-			} else {
60
-				List<String> groupIdStrs = new ArrayList<>();
61
-				if (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) {
62
-					groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(","));
63
-				}
64
-				for (XxlJobGroup groupItem:jobGroupList_all) {
65
-					if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) {
66
-						jobGroupList.add(groupItem);
67
-					}
68
-				}
69
-			}
70
-		}
54
+		List<XxlJobGroup> jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all);
71
 		if (jobGroupList==null || jobGroupList.size()==0) {
55
 		if (jobGroupList==null || jobGroupList.size()==0) {
72
 			throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
56
 			throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
73
 		}
57
 		}

+ 19 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java 파일 보기

1
 package com.xxl.job.admin.core.model;
1
 package com.xxl.job.admin.core.model;
2
 
2
 
3
+import org.springframework.util.StringUtils;
4
+
3
 /**
5
 /**
4
  * @author xuxueli 2019-05-04 16:43:12
6
  * @author xuxueli 2019-05-04 16:43:12
5
  */
7
  */
51
 		this.permission = permission;
53
 		this.permission = permission;
52
 	}
54
 	}
53
 
55
 
56
+	// plugin
57
+	public boolean validPermission(int jobGroup){
58
+		if (this.role == 1) {
59
+			return true;
60
+		} else {
61
+			if (StringUtils.hasText(this.permission)) {
62
+				for (String permissionItem : this.permission.split(",")) {
63
+					if (String.valueOf(jobGroup).equals(permissionItem)) {
64
+						return true;
65
+					}
66
+				}
67
+			}
68
+			return false;
69
+		}
70
+
71
+	}
72
+
54
 }
73
 }