首先你应该知道 Jenkins 并不总是能够告诉你用户是否存在。来自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 + "; ")
}
注意:这取决于 Jenkins 配置,并且可能无法在使用另一个(不是HudsonPrivateSecurityRealm
)安全领域的系统上工作。
解决方案 2
SecurityRealm#loadUserByUsername
如果用户存在则返回用户详细信息,UsernameNotFoundException
否则抛出:
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) { }
}
这是一个棘手的问题,但应该适用于所有安全领域,因为我们使用存在于顶级抽象类 ( SecurityRealm
) 中的方法。