Prima di tutto si deve sapere che Jenkins non sarà sempre in grado di dirvi se esiste l'utente o meno. Da Jenkins' javadoc:
Questo accade, per esempio, quando il regno di sicurezza è in cima alla realizzazione servlet, non c'è modo di sapere se anche un utente di un dato nome esiste o no.
Ho trovato due soluzioni.
Soluzione 1
HudsonPrivateSecurityRealm.html#getAllUsers()
restituisce tutti gli utenti che possono effettuare il login al sistema. E questo funziona per me:
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 + "; ")
}
Nota: questo dipende dalla configurazione Jenkins e potrebbe non funzionare sul sistema in cui usato un altro (non un HudsonPrivateSecurityRealm
) ambito di sicurezza.
Soluzione 2
SecurityRealm#loadUserByUsername
dettagli rendimenti utente se l'utente esiste e getta UsernameNotFoundException
altrimenti:
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) { }
}
Questa è una difficile, ma dovrebbe funzionare con tutti i regni di sicurezza, come si usa il metodo che esiste nella classe astratta di primo livello (SecurityRealm
).
fonte
2015-06-20 15:49:43
Ho provato la soluzione 1 e ha funzionato, ha anche prodotto la lista quasi istantaneamente, dove la mia soluzione richiede circa un minuto. Grazie Vitalii! –
Grazie per alcune soluzioni. Per segnalare i nostri risultati, ho trovato che la soluzione 1 non funziona con il plugin Active Directory utilizzato per auth (il plugin non ha getAllUsers()). La Soluzione 2 alla fine scade il nostro proxy inverso httpd Apache di fronte a Jenkins poiché credo che stia enumerando ogni utente in AD (molte migliaia nella nostra azienda). Suppongo che questo sia il tipo di caso risolto da un prodotto che conserva il proprio database utente, che memorizza nella cache da AD/LDAP. – jblaine
@jblaine grazie per aver segnalato questo. Qual è il problema che stai cercando di risolvere? Non penso che tu voglia inviare mail a migliaia di persone contemporaneamente ... –