我正在为Jenkins开发我的第一个插件,它将为Jenkins基于矩阵的安全授权添加一些额外的权限。
我正在NetBeans 8.1中开发插件。该插件可以构建并部署到Jenkins 1.625.3,我可以看到我的权限显示在矩阵表中。
该插件有一个扩展RunListener<AbstractBuild>
扩展点的类。我重写setUpEnvironment
方法,在这个方法中,我试图查看导致构建的用户是否具有我的新权限。
不幸的是,每当我拨打User.get(username).hasPermission(permission)
时,结果都是正确的。我通过创建两个用户来简化测试:
如果我在setUpEnvironment
方法中放入调试中断,并添加以下监视,则结果为true:
User.get("devuser").hasPermission(hudson.model.Hudson.ADMINISTER)
直观地说,我查看上面的代码并认为hasPermission
基于User
方法返回的get
。但是,我开始怀疑在用户对象上调用hasPermission
并不重要,安全原则是一些具有超级访问权限的系统用户。
有人能指出我正确的方向吗?
谢谢!
答案 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)