You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows Server的Jenkins中强制URL携带用户名密码访问?

Windows Server上的Jenkins强制URL参数认证配置方案

Windows Server上的Jenkins支持实现你要求的配置,但并非原生功能,需要通过自定义拦截脚本+插件来实现,具体方案如下:

核心实现思路

Jenkins原生认证依赖表单/HTTP基本认证等方式,不支持直接通过URL参数校验凭证。我们需要通过添加自定义请求拦截器,在请求进入Jenkins核心逻辑前校验URL中的uname和pwd参数,再对接Jenkins内置的用户凭证系统完成验证。

具体配置步骤

1. 先启用Jenkins基础安全认证

确保Jenkins已经配置了用户凭证体系(比如内置用户数据库、Active Directory等),这是后续参数校验的基础:

  • 进入Jenkins「Manage Jenkins」→「Configure Global Security」
  • 勾选「Enable security」,选择合适的安全域(比如「Jenkins’ own user database」)并创建测试用户。

2. 安装必要插件

需要安装以下插件来支持自定义脚本拦截:

  • Script Security Plugin:允许执行Groovy脚本并授予必要权限
  • Groovy Plugin:支持编写和运行Groovy脚本扩展Jenkins功能

3. 添加自定义请求拦截脚本

通过Jenkins的Servlet Filter机制拦截所有请求,实现参数校验逻辑。可以通过以下两种方式实现:

方式一:通过脚本控制台临时加载(适合测试)

进入Jenkins「Manage Jenkins」→「Script Console」,执行以下Groovy脚本:

import jenkins.model.Jenkins
import hudson.security.User
import hudson.security.PasswordEncoder
import javax.servlet.*
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

class ParamAuthFilter implements Filter {
    void init(FilterConfig config) {}
    void destroy() {}
    
    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        HttpServletRequest req = (HttpServletRequest) request
        HttpServletResponse res = (HttpServletResponse) response
        
        String uname = req.getParameter("uname")
        String pwd = req.getParameter("pwd")
        
        // 检查参数是否存在
        if (!uname || !pwd) {
            res.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
            res.getWriter().write("错误:请携带uname和pwd参数访问Jenkins")
            return
        }
        
        // 校验用户凭证
        User user = User.getById(uname, false)
        if (!user) {
            res.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
            res.getWriter().write("错误:用户名不存在")
            return
        }
        
        PasswordEncoder encoder = Jenkins.get().getSecurityRealm().getPasswordEncoder()
        if (!encoder.matches(pwd, user.getProperty(hudson.security.HudsonPrivateSecurityRealm.Details.class).getPassword())) {
            res.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
            res.getWriter().write("错误:密码不正确")
            return
        }
        
        // 验证通过,继续执行请求
        chain.doFilter(request, response)
    }
}

// 注册Filter到Jenkins的Jetty容器
def filter = new ParamAuthFilter()
def container = Jenkins.get().servletContext.servletHandler
container.addFilter(filter, "/*", EnumSet.of(javax.servlet.DispatcherType.REQUEST))
filter.init(null)

方式二:持久化配置(生产环境推荐)

临时脚本重启Jenkins后会失效,要持久化可以:

  1. 编写Groovy脚本文件(比如param-auth-filter.groovy)
  2. 将文件放到Jenkins的$JENKINS_HOME/init.groovy.d/目录下(Windows下通常是C:\Program Files\Jenkins\init.groovy.d\,如果目录不存在就手动创建)
  3. 重启Jenkins,脚本会自动加载并注册Filter

注意事项

  • 安全性提醒:URL参数传递密码会被记录在浏览器历史、服务器访问日志中,安全风险远高于HTTPS下的表单/基本认证。如果核心需求是提升Jenkins安全性,更推荐配置HTTPS+HTTP基本认证,而非URL参数传凭证。
  • Windows环境兼容性:Jenkins在Windows和Linux下的插件、脚本机制完全一致,上述配置步骤无需针对Windows做特殊调整,仅需注意文件路径的Windows格式(比如用\而非/)。

内容的提问来源于stack exchange,提问作者Veronica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:25:35