詹金斯 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)
,结果都是真的。我通过创建两个用户简化了测试:
- adminuser: 有管理员权限
- 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)
我正在为 Jenkins 开发我的第一个插件,它将为 Jenkins 基于矩阵的安全授权添加一些额外的权限。
我正在 NetBeans 8.1 中开发插件。该插件可以构建并部署到 Jenkins 1.625.3,我可以在矩阵 table.
中看到我的许可该插件有一个 class 扩展 RunListener<AbstractBuild>
扩展点。我重写了 setUpEnvironment
方法,在这个方法中,我试图查看导致构建的用户是否拥有我的新权限。
不幸的是,每次我调用User.get(username).hasPermission(permission)
,结果都是真的。我通过创建两个用户简化了测试:
- adminuser: 有管理员权限
- 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)