Jenkins角色权限实现办法-增量方式

568 阅读8分钟

Jenkins角色权限实现办法

最近在写Devops项目里的一部分,涉及到了Jenkins的角色权限模块。Jenkins实际上是有一个叫“Role-based Authorization Strategy”的插件可以在Jenkins里面以配置的方式实现角色权限配置的,网上大多数博客也只介绍了“Role-based Authorization Strategy”的使用方法,而忽略了对与其API的调用,因此鄙人写作之目的就是记录下使用代码去调用“Role-based Authorization Strategy”API的方法,为以后需要用到的人提供参考。

  1. 首先我们先从Role-based Authorization Strategy的使用开始介绍。帮助读者了解Role-based Authorization Strategy这个插件
    • 插件的安装
    以admin账号登录Jenkins后,在左侧导航栏点击Manage Jenkins

image.png 点击插件市场,下载“Role-based Authorization Strategy”插件

image.png

image.png 插件安装完成后,启用“Role-based Authorization Strategy”需要重启一次Jenkins 重启Jenkins的方式有两种

  • 在Linux上使用如下命令

启动

service jenkins start

重启

service jenkins restart

停止

service jenkins stop

此外,还有直接使用url的方式,不过不包括启动(此时服务还未启动),只需要在访问jenkins服务器的网址url地址就可以了
此处假定 jenkins部署在本机,端口为 8080

关闭Jenkins

http://localhost:8080/exit 

重启Jenkins

http://localhost:8080/restart 

重新加载配置信息

http://localhost:8080/reload 

完成插件的安装与启动后,回到设置页面,进入安全设置,将安全策略设置为“Role-Based Strategy”

image.png

image.png

点击应用后,回到Jenkins设置页面,点击Manage and Assign Roles进入角色配置页面

image.png

192.168.10.37_8888_manage_role-strategy_.png

  • Global roles (全局角色):管理员等高级用户可以创建基于全局的角色
  • Item roles(项目角色):针对某个或者某些项目的角色
  • Agentroles(代理角色): 讲实话,我没有深入研究这个,应该顾名思义就是用来做代理的角色吧

在Jenkins里实现不同账号登录进来具备不同的权限的功能,使用Global roles与Item roles就已经够了。

一个用户至少应该绑定一个具备Overall-Read权限的Global roles,这样才能保证账号与角色绑定后能查看到项目列表

控制用户能够看到哪些项目,则由Item roles决定。点击add按钮,角色新增完成后,再在表格中勾选角色具备的权限,分配好权限后点击应用按钮生效。

image.png

新建了角色后,下一步自然就是角色与用户绑定。角色的创建我们已经了解清楚,那如何创建用户呢?

同样,在Jenkins设置页面,点击Users

image.png 点击Create User按钮开始创建用户

image.png

image.png

创建了用户后,就该到了用户与角色绑定的关键一步了。 再次打开Manage and Assign Roles image.png 来到Assign Roles页面

image.png

QQ截图20240103172109.png

作为以上步骤后,Jenkins的角色权限就已经成功实现。 下面我们看一下效果

image.png 我们给test01的用户绑定具备全局读权限的projectPersonnel的全局角色,然后再给test01用户绑定devopsDevloper的项目权限。devopsDevloper的项目权限匹配规则为devops.*,则devopsDevloper角色对于devops字符串开头的项目具备配置好的权限。 将test01账号与角色绑定完成后,登录test01账号,可以看到该账号只能看到devops字符串开头的项目

image.png

到此,使用“Role-based Authorization Strategy”插件在页面上通过配置的形式为Jenkins的账号加上权限就已经完成。

可是我自己的需求,并非使用在页面上配置的方法来进行jenkins的角色权限管理。而是需要使用代码在业务中穿插设置Jenkins账号角色权限。在页面上进行配置的方式显然已经不能满足我的需求了。

本文到此处的实现方式在各大博客网站上有着很多相似的版本,而对于使用代码去实现的办法去鲜有人提到,也许是因为“Role-based Authorization Strategy”在md介绍文档里已经写了api文档吧。

但是对于我个人而言我是没有在第一时间成功调用通“Role-based Authorization Strategy”提供的api接口的,罪魁祸首可能是鄙人0分的英语四级水平让我没有办法在脱离翻译软件的情况下读懂api文档。

通过api的形式实现Jenkins角色权限配置的实现方法

踩坑之处:“Role-based Authorization Strategy”的api需要在接口后面加上【Jenkins-Crumb】参数。

Jenkins-Crumb值得获取

接口地址:/crumbIssuer/api/xml 请求类型:GET, 请求示例:

192.168.10.37:8888/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)
请求参数
参数名类型含义是否必填备注
xpathString 值为:concat(//crumbRequestField,%22:%22,//crumb)
返回值
参数名类型含义备注
String 该接口直接返回的字符串返回示例Jenkins-Crumb:c7370ba2a056b17e3a684062e0232bbc18236adc678e3c208ed4d8bd0e68c474

postmanc成功调用截图

image.png

用户

用户为Jenkins自带的功能,不需要插件的支持。对应的设置页面如图所示 image.png

添加用户

接口地址:/securityRealm/createAccountByAdmin?Jenkins-Crumb=[value]

接口类型:POST

请求参数(body里面)
参数名类型含义是否必填备注
usernameString用户名 
password1String密码 
password2String确认密码需要和密码一致
fullnameString用户全名用户全名,显示在Jenkins右上角的名字
emailString邮箱必须要有,可以是重复的

该接口成功后将重定向到用户列表,因此没有返回值。

使用该接口,要将第一步获取到的Jenkins-Crumb通过地址栏传过去

postman成功 image.png

删除用户

接口地址:/user/[username]/doDelete?Jenkins-Crumb=[value]

接口类型:POST

地址栏上的[username]就时需要删除的用户的用户名,例如需要删除的用户民为test06,则请求为

"/user/test06/doDelete?Jenkins-Crumb=2cc4cdc837f61211d145867ca5faf2c7ec23f92bac2404422b2ea42446099054"

postman调用成功

image.png

角色

新增角色

接口地址:/role-strategy/strategy/addRole?Jenkins-Crumb=[value]

接口类型:POST

请求参数(body里面)
参数名类型含义是否必填备注
typeString角色类型角色类型分为globalRoles, projectRoles, slaveRoles三种类型
roleNameString角色名角色名字
patternString匹配规则角色与项目的匹配规则,使用正则表达式
overwriteBoolean是否覆写若为true则会覆盖已经有的角色;若为false,当角色名已经存在时则创建角色失败
permissionIdsString权限角色具有的权限,多个则以都好分割,权限列表请见附表
postman调用成功

image.png

删除角色

接口地址:/role-strategy/strategy/removeRoles?Jenkins-Crumb=[value]

接口类型:POST

请求参数(body里面)
参数名类型含义是否必填备注
typeString角色类型角色类型分为globalRoles, projectRoles, slaveRoles三种类型
roleNameString角色名角色名字

postman调用成功

image.png

与用户绑定角色

接口地址:/role-strategy/strategy/assignUserRole?Jenkins-Crumb=[value]

接口类型:POST

请求参数(body里面)
参数名类型含义是否必填备注
userString用户名 
roleNameString角色名角色名字
typeString角色类型 角色类型分为globalRoles, projectRoles, slaveRoles三种类型

注:一个用户至少应该绑定一个具有读权限的全局角色,不然用户将无法查看到任何项目

postman成功调用

image.png

image.png

用户角色解绑

接口地址:/role-strategy/strategy/unassignUserRole?Jenkins-Crumb=[value]

接口类型:POST

请求参数(body里面)
参数名类型含义是否必填备注
userString用户名 
roleNameString角色名角色名字
typeString角色类型 角色类型分为globalRoles, projectRoles, slaveRoles三种类型

postman成功调用

image.png

附表

全局角色

hudson.model.Hudson.Administer全部-所有对象管理权限
hudson.model.Hudson.Read全部-读取权限
com.cloudbees.plugins.credentials.CredentialsProvider.Create凭据-创建
com.cloudbees.plugins.credentials.CredentialsProvider.Delete凭据-删除
com.cloudbees.plugins.credentials.CredentialsProvider.ManageDomains凭据-管理域
com.cloudbees.plugins.credentials.CredentialsProvider.Update凭据-更新
com.cloudbees.plugins.credentials.CredentialsProvider.View凭据-浏览权限
hudson.model.Computer.Build代理-构建
hudson.model.Computer.Configure代理-配置
hudson.model.Computer.Connect代理-链接
hudson.model.Computer.Create代理-创建
hudson.model.Computer.Delete代理-删除
hudson.model.Computer.Disconnect代理-断开连接
hudson.model.Computer.Provision 
hudson.model.Item.Build作业-构建
hudson.model.Item.Cancel作业-取消
hudson.model.Item.Configure作业-配置
hudson.model.Item.Create作业-创建
hudson.model.Item.Delete作业-删除
hudson.model.Item.Discover作业-发现
hudson.model.Item.Move作业-移动
hudson.model.Item.Read作业-读取
hudson.model.Item.Workspace作业-工作目录权限
hudson.model.Run.Delete运行-删除
hudson.model.Run.Replay运行-回放
hudson.model.Run.Update运行-更新
hudson.model.View.Configure视图-配置
hudson.model.View.Create视图-创建
hudson.model.View.Delete视图-删除
hudson.model.View.Read视图-读取
hudson.scm.SCM.Tag

项目角色

com.cloudbees.plugins.credentials.CredentialsProvider.Create凭据-创建
com.cloudbees.plugins.credentials.CredentialsProvider.Delete凭据-删除
com.cloudbees.plugins.credentials.CredentialsProvider.ManageDomains凭据-管理域
com.cloudbees.plugins.credentials.CredentialsProvider.Update凭据-更新
com.cloudbees.plugins.credentials.CredentialsProvider.View凭据-浏览权限
hudson.model.Item.Build作业-构建
hudson.model.Item.Cancel作业-取消
hudson.model.Item.Configure作业-配置
hudson.model.Item.Create作业-创建
hudson.model.Item.Delete作业-删除
hudson.model.Item.Discover作业-发现
hudson.model.Item.Move作业-移动
hudson.model.Item.Read作业-读取
hudson.model.Item.Workspace作业-工作目录权限
hudson.model.Run.Delete运行-删除
hudson.model.Run.Replay运行-回放
hudson.model.Run.Update运行-更新
hudson.model.View.Configure视图-配置
hudson.model.View.Create视图-创建
hudson.model.View.Delete视图-删除
hudson.model.View.Read视图-读取
hudson.scm.SCM.Tag