在使用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了。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐