讲师中心 微信公众号
AI工具推荐 视频效率加速

Jenkins Pipeline 中安全获取用户角色的正确实践

雨丽同学_7428

雨丽同学_7428

发布时间:2026-01-19 14:41:17

|

502人浏览过

|

来源于php中文网

原创

Jenkins Pipeline 中安全获取用户角色的正确实践

在 jenkins pipeline 中直接访问 role-based strategy 插件的授权策略会触发 `notserializableexception`,因 `rolebasedauthorizationstrategy` 对象不可序列化;解决方案是将权限检查逻辑封装为外部可序列化函数,并避免在 `script` 块中直接引用非序列化 jenkins 内部对象。

Jenkins Pipeline 使用 Groovy 编写,其执行引擎要求所有在 script 块中定义并跨阶段/步骤持久化的对象必须实现 java.io.Serializable。而 com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy(即 RoleBasedAuthorizationStrategy)及其关联的 roleMaps、grantedRoles 等内部结构均未实现序列化接口。因此,当您在 script 块内直接调用 Jenkins.instance.getAuthorizationStrategy() 并尝试遍历其状态时,Pipeline 会在序列化检查阶段失败,抛出:

Caused: java.io.NotSerializableException: com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy

✅ 正确做法:将敏感 Jenkins 实例操作移至 pipeline 顶层的 def 函数中(即“全局函数”),该函数在 Pipeline 编译期解析、运行于 master 节点且不参与分布式序列化流程;而 script 块内仅调用其返回值(如 List<String> 角色名列表),确保数据轻量、可序列化。

以下是推荐的完整实现方式:

js2java
js2java

JavaScript 到 Java 全栈翻译助手,专为前端开发者学习 Java 或快速实现后端业务逻辑而设计。当用户提到以下场景时必须使用此技能: - "帮我把这段 JS 代码转成 Java" - "用 Java 怎么写这个逻辑" - "我习惯用 JS 写,想翻译成 Java" - "教我 Java,我要写后端接...

下载
pipeline {
    agent any
    environment {
        TIMEOUT = '30'
        RUNNER_USER = 'admin'
    }
    stages {
        stage('Check Admin Permission & Prompt') {
            steps {
                script {
                    def userRoles = getRoles(env.RUNNER_USER)
                    if (userRoles.contains('admin')) {
                        timeout(time: Integer.parseInt(env.TIMEOUT), unit: 'SECONDS') {
                            input(
                                message: "Do you want to overwrite the lock?",
                                ok: "Yes"
                            )
                        }
                    } else {
                        echo "Warning: User '${env.RUNNER_USER}' is not in 'admin' role. Skipping confirmation."
                    }
                    echo "Job finished successfully."
                }
            }
        }
    }
}

// ✅ 定义为 pipeline 顶层函数(非 script 块内),可安全访问 Jenkins 实例
def getRoles(String username) {
    // 注意:此函数在 master 上执行,无需序列化返回值以外的对象
    def authStrategy = Jenkins.instance.getAuthorizationStrategy()

    // 防御性检查:确保使用的是 RoleBasedAuthorizationStrategy
    if (!(authStrategy instanceof com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy)) {
        error "Expected RoleBasedAuthorizationStrategy, but got ${authStrategy.class.name}"
    }

    // 构建 {Role -> List<User>} 映射:roleMaps 是 Map<Permission, Map<Role, Set<String>>>
    // 我们关注的是 Global/Project RoleMap 中的 grantedRoles(类型为 Map<Role, Set<String>>)
    def allGrants = [:]
    authStrategy.roleMaps.values().each { roleMap ->
        roleMap.grantedRoles.each { role, users ->
            allGrants[role] = allGrants.getOrDefault(role, []) + users.toList()
        }
    }

    // 反向查找:哪些 Role 包含当前用户
    def rolesForUser = allGrants.findAll { _, users -> users.contains(username) }
        .keySet()
        .collect { it.name } // 提取 Role 名称(String)

    return rolesForUser
}

? 关键注意事项:

  • ⚠️ 不要在 script 块中直接调用 Jenkins.instance 或持有其子对象(如 authStrategy, roleMaps)——它们不可序列化;
  • ✅ 将 Jenkins API 调用严格限制在顶层 def 函数中,仅返回简单类型(String, List<String>, Boolean);
  • ? getRoles() 函数需运行在 Jenkins Master 节点(默认满足),确保有权限读取全局授权策略;
  • ? 建议添加类型校验(如 instanceof)和空值防护,提升健壮性;
  • ? 若使用 Jenkins 2.387+ 与 Role Strategy Plugin 3.5+,注意 grantedRoles 的实际结构可能因作用域(Global/Project)略有差异,上述示例已兼容主流版本。

通过该模式,您既能安全获取用户所拥有的角色(如 admin),又能完全规避 NotSerializableException,保障 Pipeline 稳定执行。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

1993

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

2934

2023.10.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5979

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2130

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

143

2025.11.30

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3108

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4689

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3749

2025.12.29

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn