在使用java调用jenkins REST API时,使用登陆的用户名和密码连接调用api报错:hudson.security.AccessDeniedException2: anonymous is missing the Overall/Read permission
这里将密码改为生成的用户token就可以正常连接
一、使用jenkins-client调用jenkins REST API
1、引入pom依赖
<!-- https://mvnrepository.com/artifact/com.offbytwo.jenkins/jenkins-client -->
<dependency>
<groupId>com.offbytwo.jenkins</groupId>
<artifactId>jenkins-client</artifactId>
<version>0.3.8</version>
</dependency>
2、测试连接的java代码
@Slf4j
public class Test {
public static void main(String[] args) throws Exception {
String url = "http://192.168.225.1:8080";
String username = "admin";
String password = "1234abcd";
String jobName = "demo-pipeline";
# 连接Jenkins Server
JenkinsServer jenkins = new JenkinsServer(new URI(url), username, password);
# 获取版本号
JenkinsVersion version = jenkins.getVersion();
log.info(version.getLiteralVersion());
# 根据job名称获取XML的配置
String jobXml = jenkins.getJobXml(jobName);
log.info(jobXml);
JobWithDetails job = jenkins.getJob(jobName);
Optional.ofNullable(job).ifPresent(val -> {
log.info(val.getUrl());
});
}
}
运行上面的代码,控制台显示如下错误:
2020-09-15 07:00:29.148+0000 [id=14] WARNING h.i.i.InstallUncaughtExceptionHandler#handleException: Caught unhandled exception with ID 5951bc12-986b-4f66-9d59-0ba9c1073def
hudson.security.AccessDeniedException2: anonymous is missing the Overall/Read permission
at hudson.security.ACL.checkPermission(ACL.java:79)
at hudson.security.AccessControlled.checkPermission(AccessControlled.java:47)
at jenkins.model.Jenkins.getTarget(Jenkins.java:4792)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:721)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:694)
at org.kohsuke.stapler.Stapler.service(Stapler.java:240)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:763)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:551)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:620)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1610)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1369)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:489)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1580)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1284)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.Dispatcher.include(Dispatcher.java:121)
at hudson.security.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:171)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:51)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1618)
at jenkins.security.SuspiciousRequestFilter.doFilter(SuspiciousRequestFilter.java:36)
二、解决方法
我们打开JenkinsServer的源码,如下图所示,推荐我们用token进行连接,所以我们需要将密码改为token
如何获取用户的token,在Jenkins中通过如下方式生成token
最后将我们的密码改为token就可以正常连接Jenkins Server了。