Zunächst einmal sollten Sie wissen, dass Jenkins nicht immer der Lage sein, Ihnen zu sagen, ob der Benutzer vorhanden ist oder nicht. Von Jenkins' javadoc:
Dies geschieht zum Beispiel, wenn der Sicherheitsbereich auf der Servlet-Implementierung ist, gibt es keine Möglichkeit, selbst wenn ein Benutzer von einem bestimmten Namen zu kennen existiert oder nicht.
Ich fand zwei Lösungen.
Lösung 1
HudsonPrivateSecurityRealm.html#getAllUsers()
kehrt alle Benutzer, die sich am System anmelden können. Und das funktioniert für mich:
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 + "; ")
}
Hinweis: dies auf der Jenkins Config abhängig und kann nicht auf dem System arbeiten, in dem ein anderen (nicht HudsonPrivateSecurityRealm
) Sicherheitsbereich eingesetzt.
Lösung 2
SecurityRealm#loadUserByUsername
kehrt Benutzerdaten, wenn der Benutzer vorhanden ist, und wirft UsernameNotFoundException
anders:
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) { }
}
Diese knifflige Frage ist, sollte aber mit allen Sicherheitsbereichen arbeiten, wie wir die Methode verwenden, die vorhanden ist in der obersten abstrakten Klasse (SecurityRealm
).
Ich versuchte Lösung 1 und es funktionierte, es produzierte auch die Liste fast sofort, wo meine Lösung etwa eine Minute dauert. Danke Vitalii! –
Vielen Dank für einige Lösungen. Um unsere Ergebnisse zu berichten, habe ich festgestellt, dass Solution 1 nicht mit dem Active Directory Plugin funktioniert, das für auth verwendet wird (das Plugin hat getAllUsers() nicht). Lösung 2 beendet schließlich unseren Apache httpd Reverse Proxy vor Jenkins, da ich glaube, dass es jeden Benutzer in AD aufzählt (viele Tausende in unserer Firma). Ich nehme an, das ist die Art von Fall, der von einem Produkt gelöst wird, das seine eigene Benutzerdatenbank beibehält, die von AD/LDAP zwischenspeichert. – jblaine
@jblaine danke für das Melden. Was ist das Problem, das Sie versuchen zu lösen? Ich glaube nicht, dass du Tausende von Leuten auf einmal mailen willst ... –