Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
2739f57
initial commit - tests pending potentially
ankit--sethi Aug 19, 2025
832f469
[CI] Auto commit changes from spotless
Aug 19, 2025
1bd116a
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 19, 2025
aa9b2fb
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 20, 2025
6a8fbb2
fix syntax
ankit--sethi Aug 20, 2025
767c34c
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 20, 2025
e4fa7d0
Merge remote-tracking branch 'origin/feature/session-tokens' into fea…
ankit--sethi Aug 20, 2025
118705f
correct javadoc
ankit--sethi Aug 20, 2025
e466371
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 20, 2025
239d510
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 21, 2025
b174e5a
fix style issue
ankit--sethi Aug 21, 2025
7c3c8a3
Merge remote-tracking branch 'origin/feature/session-tokens' into fea…
ankit--sethi Aug 21, 2025
0f28ac0
fix tests
ankit--sethi Aug 21, 2025
2a03dc9
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 21, 2025
fac7f3b
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 21, 2025
113b4ba
[PoC] Pluggable authenticator chain
slobodanadamovic Aug 22, 2025
41f3714
Merge branch 'main' of github.com:elastic/elasticsearch into poc-cust…
slobodanadamovic Aug 22, 2025
040a9aa
[CI] Auto commit changes from spotless
Aug 22, 2025
b2b6404
spotless + remove unused method
slobodanadamovic Aug 25, 2025
c782a2c
fix javadoc line lenght
slobodanadamovic Aug 25, 2025
b2d3938
Merge branch 'main' of github.com:elastic/elasticsearch into poc-cust…
slobodanadamovic Aug 25, 2025
692d8e3
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Aug 25, 2025
2c74a18
Merge remote-tracking branch 'slobodan/poc-custom-authenticator-chain…
ankit--sethi Aug 25, 2025
cf543eb
refactor with code review feedback and new validation for cloud-saml-…
ankit--sethi Aug 25, 2025
ebd4188
[CI] Auto commit changes from spotless
Aug 25, 2025
f22bf54
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 26, 2025
31b6b56
Merge branch 'main' into feature/session-tokens
ankit--sethi Aug 27, 2025
b7411f2
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Aug 28, 2025
49e4d66
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Aug 28, 2025
01a3f18
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 3, 2025
4a32400
code review stuff
ankit--sethi Sep 3, 2025
14ccac1
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 3, 2025
2d716c6
[CI] Auto commit changes from spotless
Sep 3, 2025
808556a
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 3, 2025
72d3d0f
followups from previous PR -
ankit--sethi Sep 5, 2025
d98bebb
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 5, 2025
491e378
[CI] Auto commit changes from spotless
Sep 5, 2025
720bc14
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 5, 2025
8b33379
Merge branch 'feature/session-tokens' of github.com:ankit--sethi/elas…
ankit--sethi Sep 5, 2025
90ef203
revert bad change
ankit--sethi Sep 5, 2025
ce7074c
[CI] Auto commit changes from spotless
Sep 5, 2025
ff65077
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 8, 2025
495c53b
merging
ankit--sethi Sep 8, 2025
765895e
Merge remote-tracking branch 'origin/feature/session-tokens' into fea…
ankit--sethi Sep 8, 2025
56082e9
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 11, 2025
cf5c58c
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 12, 2025
f5c922d
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 12, 2025
14857d0
fix imports
ankit--sethi Sep 12, 2025
186cbdc
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 12, 2025
7873974
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 12, 2025
27a4351
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 15, 2025
32fb02a
Merge branch 'feature/session-tokens' of github.com:ankit--sethi/elas…
ankit--sethi Sep 15, 2025
e5002d1
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 15, 2025
df0c68a
fix merge
ankit--sethi Sep 16, 2025
c64cafd
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 16, 2025
b466ee3
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 24, 2025
a745f16
fix import
ankit--sethi Sep 24, 2025
22ea22d
don't need this any more
ankit--sethi Sep 24, 2025
458bba7
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 25, 2025
98689ad
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 26, 2025
58826d4
code review changes + update pointer
ankit--sethi Sep 26, 2025
5225955
fix test
ankit--sethi Sep 26, 2025
4d6d6a6
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 29, 2025
88ca9e5
Update x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/s…
ankit--sethi Sep 29, 2025
c150e24
code review stuff
ankit--sethi Sep 29, 2025
a98393e
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 29, 2025
3c0ba02
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 29, 2025
3ea3405
Merge branch 'main' into feature/session-tokens
ankit--sethi Sep 29, 2025
f75f74c
Merge branch 'main' of github.com:ankit--sethi/elasticsearch into fea…
ankit--sethi Sep 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,26 @@

package org.elasticsearch.xpack.security.authc;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.xpack.core.common.IteratingActionListener;
import org.elasticsearch.xpack.core.security.authc.Authentication;
import org.elasticsearch.xpack.core.security.authc.AuthenticationResult;
import org.elasticsearch.xpack.core.security.authc.AuthenticationToken;
import org.elasticsearch.xpack.core.security.authc.CustomAuthenticator;

import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Function;

import static org.elasticsearch.common.Strings.format;

public class PluggableAuthenticatorChain implements Authenticator {

private static final Logger logger = LogManager.getLogger(PluggableAuthenticatorChain.class);

private final List<CustomAuthenticator> customAuthenticators;

public PluggableAuthenticatorChain(List<CustomAuthenticator> customAuthenticators) {
Expand Down Expand Up @@ -59,28 +68,47 @@ public void authenticate(Context context, ActionListener<AuthenticationResult<Au
}
AuthenticationToken token = context.getMostRecentAuthenticationToken();
if (token != null) {
// TODO switch to IteratingActionListener
for (CustomAuthenticator customAuthenticator : customAuthenticators) {
if (customAuthenticator.supports(token)) {
customAuthenticator.authenticate(token, ActionListener.wrap(response -> {
if (response.isAuthenticated()) {
listener.onResponse(response);
} else if (response.getStatus() == AuthenticationResult.Status.TERMINATE) {
final Exception ex = response.getException();
if (ex == null) {
listener.onFailure(context.getRequest().authenticationFailed(token));
} else {
listener.onFailure(context.getRequest().exceptionProcessingRequest(ex, token));
}
} else if (response.getStatus() == AuthenticationResult.Status.CONTINUE) {
listener.onResponse(AuthenticationResult.notHandled());
}
}, ex -> listener.onFailure(context.getRequest().exceptionProcessingRequest(ex, token))));
return;
}
var iteratingListener = new IteratingActionListener<>(
listener,
getAuthConsumer(context),
customAuthenticators,
context.getThreadContext(),
Function.identity(),
result -> result.getStatus() == AuthenticationResult.Status.CONTINUE
);
try {
iteratingListener.run();
} catch (Exception e) {
logger.debug(() -> format("Authentication of token [%s] failed", token.getClass().getName()), e);
listener.onFailure(context.getRequest().exceptionProcessingRequest(e, token));
}
return;
}
listener.onResponse(AuthenticationResult.notHandled());
}

private BiConsumer<CustomAuthenticator, ActionListener<AuthenticationResult<Authentication>>> getAuthConsumer(Context context) {
AuthenticationToken token = context.getMostRecentAuthenticationToken();
return (authenticator, iteratingListener) -> {
if (authenticator.supports(token)) {
authenticator.authenticate(token, ActionListener.wrap(response -> {
if (response.isAuthenticated()) {
iteratingListener.onResponse(response);
} else if (response.getStatus() == AuthenticationResult.Status.TERMINATE) {
final Exception ex = response.getException();
if (ex == null) {
iteratingListener.onFailure(context.getRequest().authenticationFailed(token));
} else {
iteratingListener.onFailure(context.getRequest().exceptionProcessingRequest(ex, token));
}
} else if (response.getStatus() == AuthenticationResult.Status.CONTINUE) {
iteratingListener.onResponse(AuthenticationResult.notHandled());
}
}, ex -> iteratingListener.onFailure(context.getRequest().exceptionProcessingRequest(ex, token))));
} else {
iteratingListener.onResponse(AuthenticationResult.notHandled()); // try the next custom authenticator
}
};
}

}
Loading