詹金斯 API:User.hasPermission 总是 returns 真

Jenkins API: User.hasPermission always returns true

我正在为 Jenkins 开发我的第一个插件,它将为 Jenkins 基于矩阵的安全授权添加一些额外的权限。

我正在 NetBeans 8.1 中开发插件。该插件可以构建并部署到 Jenkins 1.625.3,我可以在矩阵 table.

中看到我的许可

该插件有一个 class 扩展 RunListener<AbstractBuild> 扩展点。我重写了 setUpEnvironment 方法,在这个方法中,我试图查看导致构建的用户是否拥有我的新权限。

不幸的是,每次我调用User.get(username).hasPermission(permission),结果都是真的。我通过创建两个用户简化了测试:

  1. adminuser: 有管理员权限
  2. devuser:目前只有整体阅读,没有选中其他复选框。

如果我在 setUpEnvironment 方法中放置调试中断,并添加以下监视,结果为真:

User.get("devuser").hasPermission(hudson.model.Hudson.ADMINISTER)

直觉上,我看上面的代码,认为hasPermission是基于get方法返回的User。但是,我开始怀疑在用户对象上调用 hasPermission 并不重要,安全原则是某些具有超级访问权限的系统用户。

有人能给我指出正确的方向吗?

谢谢!

矩阵截图

调试监视

的问题是 User.hasPermission(Permission p) 调用 ACL.hasPermission(Permission p) 实际上 运行s:

return hasPermission(Jenkins.getAuthentication(),p);

因此不检查加载的 User 的权限,而是检查用于执行此代码的当前 User 的权限。

如果您 运行 下面的代码来自 脚本控制台 :

println instance.getAuthorizationStrategy().
        hasPermission("devuser", hudson.model.Hudson.ADMINISTER)
println instance.getAuthorizationStrategy().getACL(User.get("devuser")).
        hasPermission(User.get("devuser").impersonate(), hudson.model.Hudson.ADMINISTER)
println instance.getAuthorizationStrategy().getACL(User.get("devuser")).
        hasPermission(User.get("devuser").impersonate(), hudson.model.Hudson.ADMINISTER)
println instance.getAuthorizationStrategy().getACL(User.get("devuser")).
        hasPermission(hudson.model.Hudson.ADMINISTER)
println instance.getAuthorizationStrategy().getACL(User.current()).
        hasPermission(hudson.model.Hudson.ADMINISTER)

它将 return:

false
false
false
true
true

作为“解决方法”尝试直接从 Jenkins 对象获取授权策略并从中执行 hasPermission(...) 方法:

def instance = Jenkins.getInstance()
instance.getAuthorizationStrategy().hasPermission("devuser", Jenkins.ADMINISTER)