首先,你应该知道,詹金斯不会总是能够告诉你的用户是否存在。从Jenkins' javadoc:
发生这种情况,例如,在安全领域是在Servlet实现的顶部,没有甚至不知道如果给定名字的用户存在与否的方式。
我找到了两个解决方案。
解决方案1个
HudsonPrivateSecurityRealm.html#getAllUsers()
回报谁可以登录到系统的所有用户。而这个工作对我来说:
import hudson.model.User
import hudson.tasks.Mailer
import jenkins.model.Jenkins
def realm = Jenkins.getInstance().getSecurityRealm()
def users = realm.getAllUsers()
for (User u : users) {
def mailAddress = u.getProperty(Mailer.UserProperty.class).getAddress()
print(mailAddress + "; ")
}
注:这依赖于詹金斯配置和其中所用另一个(非HudsonPrivateSecurityRealm
)安全领域的系统可能无法正常工作。
import hudson.model.User
import hudson.tasks.Mailer
import jenkins.model.Jenkins
import org.acegisecurity.userdetails.UsernameNotFoundException
def realm = Jenkins.getInstance().getSecurityRealm()
def users = User.getAll()
for (User u : users) {
try {
realm.loadUserByUsername(u.getId()) // throws UsernameNotFoundException
def mailAddress = u.getProperty(Mailer.UserProperty.class).getAddress()
print(mailAddress + "; ")
} catch (UsernameNotFoundException e) { }
}
这是很微妙的,但应与所有安全领域的工作,因为我们使用存在的方法:
如果用户存在,并抛出UsernameNotFoundException
否则解决方案2
SecurityRealm#loadUserByUsername
回报用户详细信息在顶级抽象类(SecurityRealm
)中。
我试过解决方案1,它的工作原理,它也几乎立即生成列表,在那里我的解决方案需要大约一分钟。感谢Vitalii! –
感谢您提供一些解决方案。为了报告我们的结果,我发现解决方案1不适用于用于身份验证的Active Directory插件(该插件没有getAllUsers())。解决方案2最终超出了我们在Jenkins面前的Apache httpd反向代理,因为我相信它是列举了AD中的每个用户(我们公司中有数千人)。我想这是一种通过保留自己的用户数据库,从AD/LDAP缓存的产品解决的情况。 – jblaine
@jblaine谢谢你报告这个。你试图解决什么问题?我不认为你想要一次邮寄数千人...... –