问题情况
因工作需要,自己开发的工程需要通过rest-api的方式调用Jenkins,集成Jenkins实现任务调度、任务查询、结果获取等,之前部署的Jenkins都是正常的,最近重新通过Docker安装部署了一个Jenkins容器,发现调用的时候提示403错误
调用过程示例代码如下:
try {
JenkinsServer jenkins = new JenkinsServer(new URI("JENKINS_URL"), JENKINS_USERNAME, JENKINS_PASSWORD);
if (jenkins.isRunning()) {
jenkins.getJob(JENKINS_JOB).build();
System.out.println(jenkins.getJob(JENKINS_JOB).getLastBuild().details().getResult());
}
} catch (Exception e) {
e.printStackTrace();
}
执行结果如下:
status code: 403, reason phrase: Forbidden
问题解决
发现了是Jenkins的CSRF机制导致的,自己新安装的Jenkins是最新版的,默认不支持关闭CSRF,所以需要在jenkins 控制台中手动关闭CSRF。解决方案为在jenkins控制台中执行以下代码。
// 允许禁用
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = true
// 强制启用
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = false
扩展阅读:
CSRF是Cross-Site Request Forgery缩写,是一种常见的来自于终端用户的攻击,主要是对其未被授权的web应用权限进行不被期望的动作执行。具体见后面的文章
评论区