in src/main/java/org/opensearch/security/auth/BackendRegistry.java [230:345]
public User authenticate(final TransportRequest request, final String sslPrincipal, final Task task, final String action) {
final boolean isDebugEnabled = log.isDebugEnabled();
if(isDebugEnabled && request.remoteAddress() != null) {
log.debug("Transport authentication request from {}", request.remoteAddress());
}
if (request.remoteAddress() != null && isBlocked(request.remoteAddress().address().getAddress())) {
if (isDebugEnabled) {
log.debug("Rejecting transport request because of blocked address: {}", request.remoteAddress());
}
return null;
}
User injectedUser = userInjector.getInjectedUser();
if(injectedUser != null) {
auditLog.logSucceededLogin(injectedUser.getName(), true, null, request, action, task);
return injectedUser;
}
if(sslPrincipal == null) {
return null;
}
User origPKIUser = new User(sslPrincipal);
if(adminDns.isAdmin(origPKIUser)) {
auditLog.logSucceededLogin(origPKIUser.getName(), true, null, request, action, task);
return origPKIUser;
}
if (!isInitialized()) {
log.error("Not yet initialized (you may need to run securityadmin)");
return null;
}
final String authorizationHeader = threadPool.getThreadContext().getHeader("Authorization");
//Use either impersonation OR credentials authentication
//if both is supplied credentials authentication win
final AuthCredentials creds = HTTPHelper.extractCredentials(authorizationHeader, log);
User impersonatedTransportUser = null;
if(creds != null) {
if (isDebugEnabled) {
log.debug("User {} submitted also basic credentials: {}", origPKIUser.getName(), creds);
}
}
//loop over all transport auth domains
for (final AuthDomain authDomain: transportAuthDomains) {
if (isDebugEnabled) {
log.debug("Check transport authdomain {}/{} or {} in total", authDomain.getBackend().getType(), authDomain.getOrder(), transportAuthDomains.size());
}
User authenticatedUser = null;
if(creds == null) {
//no credentials submitted
//impersonation possible
impersonatedTransportUser = impersonate(request, origPKIUser);
origPKIUser = resolveTransportUsernameAttribute(origPKIUser);
authenticatedUser = checkExistsAndAuthz(userCacheTransport,
impersonatedTransportUser == null ? origPKIUser : impersonatedTransportUser, authDomain.getBackend(), transportAuthorizers);
} else {
//auth credentials submitted
//impersonation not possible, if requested it will be ignored
authenticatedUser = authcz(authenticatedUserCacheTransport, transportRoleCache, creds, authDomain.getBackend(), transportAuthorizers);
}
if (authenticatedUser == null) {
for (AuthFailureListener authFailureListener : authBackendFailureListeners.get(authDomain.getBackend().getClass().getName())) {
authFailureListener.onAuthFailure(request.remoteAddress() != null ? request.remoteAddress().address().getAddress() : null, creds,
request);
}
if (isDebugEnabled) {
log.debug("Cannot authenticate transport user {} (or add roles) with authdomain {}/{} of {}, try next", creds==null?(impersonatedTransportUser==null?origPKIUser.getName():impersonatedTransportUser.getName()):creds.getUsername(), authDomain.getBackend().getType(), authDomain.getOrder(), transportAuthDomains.size());
}
continue;
}
if(adminDns.isAdmin(authenticatedUser)) {
log.error("Cannot authenticate transport user because admin user is not permitted to login");
auditLog.logFailedLogin(authenticatedUser.getName(), true, null, request, task);
return null;
}
if (isDebugEnabled) {
log.debug("Transport user '{}' is authenticated", authenticatedUser);
}
auditLog.logSucceededLogin(authenticatedUser.getName(), false, impersonatedTransportUser == null ? null : origPKIUser.getName(), request,
action, task);
return authenticatedUser;
}//end looping auth domains
//auditlog
if(creds == null) {
auditLog.logFailedLogin(impersonatedTransportUser == null ? origPKIUser.getName() : impersonatedTransportUser.getName(), false,
impersonatedTransportUser == null ? null : origPKIUser.getName(), request, task);
} else {
auditLog.logFailedLogin(creds.getUsername(), false, null, request, task);
}
log.warn("Transport authentication finally failed for {} from {}",
creds == null ? impersonatedTransportUser == null ? origPKIUser.getName() : impersonatedTransportUser.getName() : creds.getUsername(),
request.remoteAddress());
notifyIpAuthFailureListeners(request.remoteAddress() != null ? request.remoteAddress().address().getAddress() : null, creds, request);
return null;
}