Jenkins角色权限实现办法
最近在写Devops项目里的一部分,涉及到了Jenkins的角色权限模块。Jenkins实际上是有一个叫“Role-based Authorization Strategy”的插件可以在Jenkins里面以配置的方式实现角色权限配置的,网上大多数博客也只介绍了“Role-based Authorization Strategy”的使用方法,而忽略了对与其API的调用,因此鄙人写作之目的就是记录下使用代码去调用“Role-based Authorization Strategy”API的方法,为以后需要用到的人提供参考。
- 首先我们先从Role-based Authorization Strategy的使用开始介绍。帮助读者了解Role-based Authorization Strategy这个插件
- 插件的安装
点击插件市场,下载“Role-based Authorization Strategy”插件
插件安装完成后,启用“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”
点击应用后,回到Jenkins设置页面,点击Manage and Assign Roles进入角色配置页面
- Global roles (全局角色):管理员等高级用户可以创建基于全局的角色
- Item roles(项目角色):针对某个或者某些项目的角色
- Agentroles(代理角色): 讲实话,我没有深入研究这个,应该顾名思义就是用来做代理的角色吧
在Jenkins里实现不同账号登录进来具备不同的权限的功能,使用Global roles与Item roles就已经够了。
一个用户至少应该绑定一个具备Overall-Read权限的Global roles,这样才能保证账号与角色绑定后能查看到项目列表
控制用户能够看到哪些项目,则由Item roles决定。点击add按钮,角色新增完成后,再在表格中勾选角色具备的权限,分配好权限后点击应用按钮生效。
新建了角色后,下一步自然就是角色与用户绑定。角色的创建我们已经了解清楚,那如何创建用户呢?
同样,在Jenkins设置页面,点击Users
点击Create User按钮开始创建用户
创建了用户后,就该到了用户与角色绑定的关键一步了。
再次打开Manage and Assign Roles
来到Assign Roles页面
作为以上步骤后,Jenkins的角色权限就已经成功实现。 下面我们看一下效果
我们给test01的用户绑定具备全局读权限的projectPersonnel的全局角色,然后再给test01用户绑定devopsDevloper的项目权限。devopsDevloper的项目权限匹配规则为devops.*,则devopsDevloper角色对于devops字符串开头的项目具备配置好的权限。
将test01账号与角色绑定完成后,登录test01账号,可以看到该账号只能看到devops字符串开头的项目
到此,使用“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)
| 请求参数 | ||||
|---|---|---|---|---|
| 参数名 | 类型 | 含义 | 是否必填 | 备注 |
| xpath | String | 是 | 值为:concat(//crumbRequestField,%22:%22,//crumb) |
| 返回值 | |||
|---|---|---|---|
| 参数名 | 类型 | 含义 | 备注 |
| 无 | String | 该接口直接返回的字符串返回示例Jenkins-Crumb:c7370ba2a056b17e3a684062e0232bbc18236adc678e3c208ed4d8bd0e68c474 |
postmanc成功调用截图
用户
用户为Jenkins自带的功能,不需要插件的支持。对应的设置页面如图所示
添加用户
接口地址:/securityRealm/createAccountByAdmin?Jenkins-Crumb=[value]
接口类型:POST
| 请求参数(body里面) | ||||
|---|---|---|---|---|
| 参数名 | 类型 | 含义 | 是否必填 | 备注 |
| username | String | 用户名 | 是 | |
| password1 | String | 密码 | 是 | |
| password2 | String | 确认密码 | 是 | 需要和密码一致 |
| fullname | String | 用户全名 | 是 | 用户全名,显示在Jenkins右上角的名字 |
| String | 邮箱 | 是 | 必须要有,可以是重复的 |
该接口成功后将重定向到用户列表,因此没有返回值。
使用该接口,要将第一步获取到的Jenkins-Crumb通过地址栏传过去
postman成功
删除用户
接口地址:/user/[username]/doDelete?Jenkins-Crumb=[value]
接口类型:POST
地址栏上的[username]就时需要删除的用户的用户名,例如需要删除的用户民为test06,则请求为
"/user/test06/doDelete?Jenkins-Crumb=2cc4cdc837f61211d145867ca5faf2c7ec23f92bac2404422b2ea42446099054"
postman调用成功
角色
新增角色
接口地址:/role-strategy/strategy/addRole?Jenkins-Crumb=[value]
接口类型:POST
| 请求参数(body里面) | ||||
|---|---|---|---|---|
| 参数名 | 类型 | 含义 | 是否必填 | 备注 |
| type | String | 角色类型 | 是 | 角色类型分为globalRoles, projectRoles, slaveRoles三种类型 |
| roleName | String | 角色名 | 是 | 角色名字 |
| pattern | String | 匹配规则 | 是 | 角色与项目的匹配规则,使用正则表达式 |
| overwrite | Boolean | 是否覆写 | 是 | 若为true则会覆盖已经有的角色;若为false,当角色名已经存在时则创建角色失败 |
| permissionIds | String | 权限 | 是 | 角色具有的权限,多个则以都好分割,权限列表请见附表 |
| postman调用成功 |
删除角色
接口地址:/role-strategy/strategy/removeRoles?Jenkins-Crumb=[value]
接口类型:POST
| 请求参数(body里面) | ||||
|---|---|---|---|---|
| 参数名 | 类型 | 含义 | 是否必填 | 备注 |
| type | String | 角色类型 | 是 | 角色类型分为globalRoles, projectRoles, slaveRoles三种类型 |
| roleName | String | 角色名 | 是 | 角色名字 |
postman调用成功
与用户绑定角色
接口地址:/role-strategy/strategy/assignUserRole?Jenkins-Crumb=[value]
接口类型:POST
| 请求参数(body里面) | ||||
|---|---|---|---|---|
| 参数名 | 类型 | 含义 | 是否必填 | 备注 |
| user | String | 用户名 | 是 | |
| roleName | String | 角色名 | 是 | 角色名字 |
| type | String | 角色类型 | 角色类型分为globalRoles, projectRoles, slaveRoles三种类型 |
注:一个用户至少应该绑定一个具有读权限的全局角色,不然用户将无法查看到任何项目
postman成功调用
用户角色解绑
接口地址:/role-strategy/strategy/unassignUserRole?Jenkins-Crumb=[value]
接口类型:POST
| 请求参数(body里面) | ||||
|---|---|---|---|---|
| 参数名 | 类型 | 含义 | 是否必填 | 备注 |
| user | String | 用户名 | 是 | |
| roleName | String | 角色名 | 是 | 角色名字 |
| type | String | 角色类型 | 角色类型分为globalRoles, projectRoles, slaveRoles三种类型 |
postman成功调用
附表
全局角色
| 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 |