Jenkins API:User.hasPermission始终返回true

时间:2016-05-02 21:23:01

标签: jenkins jenkins-plugins

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

我正在NetBeans 8.1中开发插件。该插件可以构建并部署到Jenkins 1.625.3,我可以看到我的权限显示在矩阵表中。

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

不幸的是,每当我拨打User.get(username).hasPermission(permission)时,结果都是正确的。我通过创建两个用户来简化测试:

  1. adminuser:拥有管理员权限
  2. devuser:目前只有整体阅读,没有选中其他复选框。
  3. 如果我在setUpEnvironment方法中放入调试中断,并添加以下监视,则结果为true:

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

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

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

    谢谢!

    Matrix屏幕截图

    Matrix Screenshot

    调试手表

    Debug Watches

1 个答案:

答案 0 :(得分:1)

问题在于User.hasPermission(Permission p)调用ACL.hasPermission(Permission p)实际上运行:

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)

它将返回:

false
false
false
true
true

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

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