Skip to content

Commit 926e81d

Browse files
authored
Prefer PolarisPrincipal.getRoles in Resolver (#2925)
it should be sufficient to rely on `SecurityContext.getUserPrincipal` alone, we dont need to call `isUserInRole` explicitly. note due to the `ResolverTest` testing with non-existent roles we have to add null-filtering to the `Resolver`.
1 parent d8e6752 commit 926e81d

File tree

6 files changed

+13
-49
lines changed

6 files changed

+13
-49
lines changed

polaris-core/src/main/java/org/apache/polaris/core/persistence/resolver/Resolver.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Iterator;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Objects;
3132
import java.util.Set;
3233
import java.util.stream.Collectors;
3334
import org.apache.polaris.core.PolarisCallContext;
@@ -69,7 +70,6 @@ public class Resolver {
6970

7071
// the id of the principal making the call or 0 if unknown
7172
private final @Nonnull PolarisPrincipal polarisPrincipal;
72-
private final @Nonnull SecurityContext securityContext;
7373

7474
// reference catalog name for name resolution
7575
private final String referenceCatalogName;
@@ -137,7 +137,6 @@ public Resolver(
137137
this.diagnostics = diagnostics;
138138
this.polarisMetaStoreManager = polarisMetaStoreManager;
139139
this.cache = cache;
140-
this.securityContext = securityContext;
141140
this.referenceCatalogName = referenceCatalogName;
142141

143142
// validate inputs
@@ -467,11 +466,11 @@ private void updateResolved() {
467466

468467
// update all principal roles with latest
469468
if (!this.resolvedCallerPrincipalRoles.isEmpty()) {
470-
List<ResolvedPolarisEntity> refreshedResolvedCallerPrincipalRoles =
471-
new ArrayList<>(this.resolvedCallerPrincipalRoles.size());
472-
this.resolvedCallerPrincipalRoles.forEach(
473-
ce -> refreshedResolvedCallerPrincipalRoles.add(this.getFreshlyResolved(ce)));
474-
this.resolvedCallerPrincipalRoles = refreshedResolvedCallerPrincipalRoles;
469+
this.resolvedCallerPrincipalRoles =
470+
resolvedCallerPrincipalRoles.stream()
471+
.map(this::getFreshlyResolved)
472+
.filter(Objects::nonNull)
473+
.collect(Collectors.toList());
475474
}
476475

477476
// update referenced catalog
@@ -776,13 +775,11 @@ private ResolverStatus resolveCallerPrincipalAndPrincipalRoles(
776775
/**
777776
* Resolve all principal roles that the principal has grants for
778777
*
779-
* @param toValidate
780-
* @param resolvedCallerPrincipal1
781778
* @return the list of resolved principal roles the principal has grants for
782779
*/
783780
private List<ResolvedPolarisEntity> resolveAllPrincipalRoles(
784-
List<ResolvedPolarisEntity> toValidate, ResolvedPolarisEntity resolvedCallerPrincipal1) {
785-
return resolvedCallerPrincipal1.getGrantRecordsAsGrantee().stream()
781+
List<ResolvedPolarisEntity> toValidate, ResolvedPolarisEntity callerPrincipal) {
782+
return callerPrincipal.getGrantRecordsAsGrantee().stream()
786783
.filter(gr -> gr.getPrivilegeCode() == PolarisPrivilege.PRINCIPAL_ROLE_USAGE.getCode())
787784
.map(
788785
gr ->
@@ -791,22 +788,22 @@ private List<ResolvedPolarisEntity> resolveAllPrincipalRoles(
791788
PolarisEntityType.PRINCIPAL_ROLE,
792789
PolarisEntityConstants.getRootEntityId(),
793790
gr.getSecurableId()))
791+
.filter(Objects::nonNull)
794792
.collect(Collectors.toList());
795793
}
796794

797795
/**
798-
* Resolve the specified list of principal roles. The SecurityContext is used to determine whether
799-
* the principal actually has the roles specified.
796+
* Resolve the specified list of principal roles. The PolarisPrincipal is used to determine
797+
* whether the principal actually has the roles specified.
800798
*
801-
* @param toValidate
802-
* @param roleNames
803799
* @return the filtered list of resolved principal roles
804800
*/
805801
private List<ResolvedPolarisEntity> resolvePrincipalRolesByName(
806802
List<ResolvedPolarisEntity> toValidate, Set<String> roleNames) {
807803
return roleNames.stream()
808-
.filter(securityContext::isUserInRole)
804+
.filter(roleName -> polarisPrincipal.getRoles().contains(roleName))
809805
.map(roleName -> resolveByName(toValidate, PolarisEntityType.PRINCIPAL_ROLE, roleName))
806+
.filter(Objects::nonNull)
810807
.collect(Collectors.toList());
811808
}
812809

runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisAuthzTestBase.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.Optional;
3939
import java.util.Set;
4040
import java.util.function.Function;
41-
import java.util.stream.Collectors;
4241
import org.apache.iceberg.CatalogProperties;
4342
import org.apache.iceberg.Schema;
4443
import org.apache.iceberg.catalog.Catalog;
@@ -69,15 +68,13 @@
6968
import org.apache.polaris.core.entity.CatalogEntity;
7069
import org.apache.polaris.core.entity.CatalogRoleEntity;
7170
import org.apache.polaris.core.entity.PolarisBaseEntity;
72-
import org.apache.polaris.core.entity.PolarisEntityType;
7371
import org.apache.polaris.core.entity.PolarisPrivilege;
7472
import org.apache.polaris.core.entity.PrincipalEntity;
7573
import org.apache.polaris.core.entity.PrincipalRoleEntity;
7674
import org.apache.polaris.core.identity.provider.ServiceIdentityProvider;
7775
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
7876
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
7977
import org.apache.polaris.core.persistence.dao.entity.BaseResult;
80-
import org.apache.polaris.core.persistence.dao.entity.EntityResult;
8178
import org.apache.polaris.core.persistence.dao.entity.PrivilegeResult;
8279
import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest;
8380
import org.apache.polaris.core.persistence.resolver.ResolutionManifestFactory;
@@ -464,34 +461,9 @@ protected static void assertSuccess(BaseResult result) {
464461
protected @Nonnull SecurityContext securityContext(PolarisPrincipal p) {
465462
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
466463
Mockito.when(securityContext.getUserPrincipal()).thenReturn(p);
467-
Set<String> principalRoleNames = loadPrincipalRolesNames(p);
468-
Mockito.when(securityContext.isUserInRole(Mockito.anyString()))
469-
.thenAnswer(invocation -> principalRoleNames.contains(invocation.getArgument(0)));
470464
return securityContext;
471465
}
472466

473-
protected @Nonnull Set<String> loadPrincipalRolesNames(PolarisPrincipal p) {
474-
PolarisBaseEntity principal =
475-
metaStoreManager
476-
.findPrincipalByName(callContext.getPolarisCallContext(), p.getName())
477-
.orElseThrow();
478-
return metaStoreManager
479-
.loadGrantsToGrantee(callContext.getPolarisCallContext(), principal)
480-
.getGrantRecords()
481-
.stream()
482-
.filter(gr -> gr.getPrivilegeCode() == PolarisPrivilege.PRINCIPAL_ROLE_USAGE.getCode())
483-
.map(
484-
gr ->
485-
metaStoreManager.loadEntity(
486-
callContext.getPolarisCallContext(),
487-
0L,
488-
gr.getSecurableId(),
489-
PolarisEntityType.PRINCIPAL_ROLE))
490-
.map(EntityResult::getEntity)
491-
.map(PolarisBaseEntity::getName)
492-
.collect(Collectors.toSet());
493-
}
494-
495467
protected @Nonnull PrincipalEntity rotateAndRefreshPrincipal(
496468
PolarisMetaStoreManager metaStoreManager,
497469
String principalName,
@@ -524,7 +496,6 @@ private void initBaseCatalog() {
524496
}
525497
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
526498
Mockito.when(securityContext.getUserPrincipal()).thenReturn(authenticatedRoot);
527-
Mockito.when(securityContext.isUserInRole(Mockito.anyString())).thenReturn(true);
528499
PolarisPassthroughResolutionView passthroughView =
529500
new PolarisPassthroughResolutionView(
530501
resolutionManifestFactory, securityContext, CATALOG_NAME);

runtime/service/src/test/java/org/apache/polaris/service/catalog/generic/AbstractPolarisGenericTableCatalogTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ public void before(TestInfo testInfo) {
167167

168168
securityContext = Mockito.mock(SecurityContext.class);
169169
when(securityContext.getUserPrincipal()).thenReturn(authenticatedRoot);
170-
when(securityContext.isUserInRole(isA(String.class))).thenReturn(true);
171170

172171
PolarisAuthorizer authorizer = new PolarisAuthorizerImpl(realmConfig);
173172
ReservedProperties reservedProperties = ReservedProperties.NONE;

runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/AbstractIcebergCatalogTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@ public void before(TestInfo testInfo) {
316316

317317
securityContext = Mockito.mock(SecurityContext.class);
318318
when(securityContext.getUserPrincipal()).thenReturn(authenticatedRoot);
319-
when(securityContext.isUserInRole(isA(String.class))).thenReturn(true);
320319

321320
PolarisAuthorizer authorizer = new PolarisAuthorizerImpl(realmConfig);
322321
reservedProperties = new ReservedProperties() {};

runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/AbstractIcebergCatalogViewTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ public void before(TestInfo testInfo) {
173173

174174
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
175175
when(securityContext.getUserPrincipal()).thenReturn(authenticatedRoot);
176-
when(securityContext.isUserInRole(Mockito.anyString())).thenReturn(true);
177176

178177
PolarisAuthorizer authorizer = new PolarisAuthorizerImpl(realmConfig);
179178
ReservedProperties reservedProperties = ReservedProperties.NONE;

runtime/service/src/test/java/org/apache/polaris/service/catalog/policy/AbstractPolicyCatalogTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ public void before(TestInfo testInfo) {
188188

189189
securityContext = Mockito.mock(SecurityContext.class);
190190
when(securityContext.getUserPrincipal()).thenReturn(authenticatedRoot);
191-
when(securityContext.isUserInRole(isA(String.class))).thenReturn(true);
192191

193192
PolarisAuthorizer authorizer = new PolarisAuthorizerImpl(realmConfig);
194193
ReservedProperties reservedProperties = ReservedProperties.NONE;

0 commit comments

Comments
 (0)