Skip to content

Commit 8dac757

Browse files
committed
Move anonymous role merging from authz to authc
1 parent 07eefa9 commit 8dac757

File tree

3 files changed

+45
-14
lines changed

3 files changed

+45
-14
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/action/user/AuthenticateResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ public void writeTo(StreamOutput out) throws IOException {
3434
authentication.writeTo(out);
3535
}
3636

37-
}
37+
}

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/AuthenticationService.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,19 @@
4040
import org.elasticsearch.xpack.core.security.authz.AuthorizationEngine.EmptyAuthorizationInfo;
4141
import org.elasticsearch.xpack.core.security.support.Exceptions;
4242
import org.elasticsearch.xpack.core.security.user.AnonymousUser;
43+
import org.elasticsearch.xpack.core.security.user.AsyncSearchUser;
4344
import org.elasticsearch.xpack.core.security.user.SystemUser;
4445
import org.elasticsearch.xpack.core.security.user.User;
46+
import org.elasticsearch.xpack.core.security.user.XPackSecurityUser;
47+
import org.elasticsearch.xpack.core.security.user.XPackUser;
4548
import org.elasticsearch.xpack.security.audit.AuditTrail;
4649
import org.elasticsearch.xpack.security.audit.AuditTrailService;
4750
import org.elasticsearch.xpack.security.audit.AuditUtil;
4851
import org.elasticsearch.xpack.security.authc.support.RealmUserLookup;
4952
import org.elasticsearch.xpack.security.support.SecurityIndexManager;
5053

5154
import java.util.ArrayList;
55+
import java.util.Arrays;
5256
import java.util.Collections;
5357
import java.util.LinkedHashMap;
5458
import java.util.List;
@@ -657,7 +661,8 @@ void finishAuthentication(User finalUser) {
657661
logger.debug("user [{}] is disabled. failing authentication", finalUser);
658662
listener.onFailure(request.authenticationFailed(authenticationToken));
659663
} else {
660-
final Authentication finalAuth = new Authentication(finalUser, authenticatedBy, lookedupBy);
664+
final Authentication finalAuth = new Authentication(
665+
maybeMergeAnonymousRolesForUser(finalUser), authenticatedBy, lookedupBy);
661666
writeAuthToContext(finalAuth);
662667
}
663668
}
@@ -690,6 +695,44 @@ void writeAuthToContext(Authentication authentication) {
690695
private void authenticateToken(AuthenticationToken token) {
691696
this.consumeToken(token);
692697
}
698+
699+
private User maybeMergeAnonymousRolesForUser(User user) {
700+
if (SystemUser.is(user) || XPackUser.is(user) || XPackSecurityUser.is(user) || AsyncSearchUser.is(user)) {
701+
return user;
702+
} else if (isAnonymousUserEnabled && anonymousUser.equals(user) == false) {
703+
if (anonymousUser.roles().length == 0) {
704+
throw new IllegalStateException("anonymous is only enabled when the anonymous user has roles");
705+
}
706+
User userWithMergedRoles = new User(user.principal(),
707+
mergeAnonymousRoles(user.roles()),
708+
user.fullName(),
709+
user.email(),
710+
user.metadata(),
711+
user.enabled()
712+
);
713+
if (user.isRunAs()) {
714+
final User authenticatedUserWithMergedRoles = new User(
715+
user.authenticatedUser().principal(),
716+
mergeAnonymousRoles(user.authenticatedUser().roles()),
717+
user.authenticatedUser().fullName(),
718+
user.authenticatedUser().email(),
719+
user.authenticatedUser().metadata(),
720+
user.authenticatedUser().enabled()
721+
);
722+
userWithMergedRoles = new User(userWithMergedRoles, authenticatedUserWithMergedRoles);
723+
}
724+
return userWithMergedRoles;
725+
} else {
726+
return user;
727+
}
728+
}
729+
730+
private String[] mergeAnonymousRoles(String[] existingRoles) {
731+
String[] mergedRoles = new String[existingRoles.length + anonymousUser.roles().length];
732+
System.arraycopy(existingRoles, 0, mergedRoles, 0, existingRoles.length);
733+
System.arraycopy(anonymousUser.roles(), 0, mergedRoles, existingRoles.length, anonymousUser.roles().length);
734+
return mergedRoles;
735+
}
693736
}
694737

695738
abstract static class AuditableRequest {

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/store/CompositeRolesStore.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import org.elasticsearch.xpack.core.security.authz.store.RoleRetrievalResult;
4444
import org.elasticsearch.xpack.core.security.support.CacheIteratorHelper;
4545
import org.elasticsearch.xpack.core.security.support.MetadataUtils;
46-
import org.elasticsearch.xpack.core.security.user.AnonymousUser;
4746
import org.elasticsearch.xpack.core.security.user.AsyncSearchUser;
4847
import org.elasticsearch.xpack.core.security.user.SystemUser;
4948
import org.elasticsearch.xpack.core.security.user.User;
@@ -100,9 +99,7 @@ public class CompositeRolesStore {
10099
private final DocumentSubsetBitsetCache dlsBitsetCache;
101100
private final ThreadContext threadContext;
102101
private final AtomicLong numInvalidation = new AtomicLong();
103-
private final AnonymousUser anonymousUser;
104102
private final ApiKeyService apiKeyService;
105-
private final boolean isAnonymousEnabled;
106103
private final List<BiConsumer<Set<String>, ActionListener<RoleRetrievalResult>>> builtInRoleProviders;
107104
private final List<BiConsumer<Set<String>, ActionListener<RoleRetrievalResult>>> allRoleProviders;
108105

@@ -145,8 +142,6 @@ public CompositeRolesStore(Settings settings, FileRolesStore fileRolesStore, Nat
145142
allList.addAll(rolesProviders);
146143
this.allRoleProviders = Collections.unmodifiableList(allList);
147144
}
148-
this.anonymousUser = new AnonymousUser(settings);
149-
this.isAnonymousEnabled = AnonymousUser.isAnonymousEnabled(settings);
150145
}
151146

152147
public void roles(Set<String> roleNames, ActionListener<Role> roleActionListener) {
@@ -236,13 +231,6 @@ public void getRoles(User user, Authentication authentication, ActionListener<Ro
236231
}, roleActionListener::onFailure));
237232
} else {
238233
Set<String> roleNames = new HashSet<>(Arrays.asList(user.roles()));
239-
if (isAnonymousEnabled && anonymousUser.equals(user) == false) {
240-
if (anonymousUser.roles().length == 0) {
241-
throw new IllegalStateException("anonymous is only enabled when the anonymous user has roles");
242-
}
243-
Collections.addAll(roleNames, anonymousUser.roles());
244-
}
245-
246234
if (roleNames.isEmpty()) {
247235
roleActionListener.onResponse(Role.EMPTY);
248236
} else if (roleNames.contains(ReservedRolesStore.SUPERUSER_ROLE_DESCRIPTOR.getName())) {

0 commit comments

Comments
 (0)