如何在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后会失效,要持久化可以:
- 编写Groovy脚本文件(比如
param-auth-filter.groovy) - 将文件放到Jenkins的
$JENKINS_HOME/init.groovy.d/目录下(Windows下通常是C:\Program Files\Jenkins\init.groovy.d\,如果目录不存在就手动创建) - 重启Jenkins,脚本会自动加载并注册Filter
注意事项
- 安全性提醒:URL参数传递密码会被记录在浏览器历史、服务器访问日志中,安全风险远高于HTTPS下的表单/基本认证。如果核心需求是提升Jenkins安全性,更推荐配置HTTPS+HTTP基本认证,而非URL参数传凭证。
- Windows环境兼容性:Jenkins在Windows和Linux下的插件、脚本机制完全一致,上述配置步骤无需针对Windows做特殊调整,仅需注意文件路径的Windows格式(比如用
\而非/)。
内容的提问来源于stack exchange,提问作者Veronica
相关产品推荐
相关产品推荐

