Skip to content

Commit dae1e7d

Browse files
committed
[fix][broker] support missing cluster level fine-granted permissions (#23675)
(cherry picked from commit 1c1a5cc)
1 parent 0aa0436 commit dae1e7d

File tree

7 files changed

+689
-19
lines changed

7 files changed

+689
-19
lines changed

pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationProvider.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.pulsar.common.naming.TopicName;
3434
import org.apache.pulsar.common.policies.data.AuthAction;
3535
import org.apache.pulsar.common.policies.data.BrokerOperation;
36+
import org.apache.pulsar.common.policies.data.ClusterOperation;
3637
import org.apache.pulsar.common.policies.data.NamespaceOperation;
3738
import org.apache.pulsar.common.policies.data.PolicyName;
3839
import org.apache.pulsar.common.policies.data.PolicyOperation;
@@ -393,4 +394,23 @@ default CompletableFuture<Boolean> allowBrokerOperationAsync(String clusterName,
393394
return FutureUtil.failedFuture(
394395
new UnsupportedOperationException("allowBrokerOperationAsync is not supported yet."));
395396
}
397+
398+
399+
default CompletableFuture<Boolean> allowClusterOperationAsync(String clusterName,
400+
ClusterOperation clusterOperation,
401+
String role,
402+
AuthenticationDataSource authData) {
403+
return FutureUtil.failedFuture(
404+
new UnsupportedOperationException("allowClusterOperationAsync is not supported yet."));
405+
}
406+
407+
default CompletableFuture<Boolean> allowClusterPolicyOperationAsync(String clusterName,
408+
String role,
409+
PolicyName policy,
410+
PolicyOperation operation,
411+
AuthenticationDataSource authData) {
412+
return FutureUtil.failedFuture(
413+
new IllegalStateException("ClusterPolicyOperation [" + policy.name() + "/" + operation.name() + "] "
414+
+ "is not supported by the Authorization provider you are using."));
415+
}
396416
}

pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.apache.pulsar.common.naming.TopicName;
4040
import org.apache.pulsar.common.policies.data.AuthAction;
4141
import org.apache.pulsar.common.policies.data.BrokerOperation;
42+
import org.apache.pulsar.common.policies.data.ClusterOperation;
4243
import org.apache.pulsar.common.policies.data.NamespaceOperation;
4344
import org.apache.pulsar.common.policies.data.PolicyName;
4445
import org.apache.pulsar.common.policies.data.PolicyOperation;
@@ -567,6 +568,50 @@ public CompletableFuture<Boolean> allowBrokerOperationAsync(String clusterName,
567568
}
568569
}
569570

571+
public CompletableFuture<Boolean> allowClusterOperationAsync(String clusterName,
572+
ClusterOperation clusterOperation,
573+
String originalRole,
574+
String role,
575+
AuthenticationDataSource authData) {
576+
if (!isValidOriginalPrincipal(role, originalRole, authData)) {
577+
return CompletableFuture.completedFuture(false);
578+
}
579+
580+
if (isProxyRole(role)) {
581+
final var isRoleAuthorizedFuture = provider.allowClusterOperationAsync(clusterName,
582+
clusterOperation, role, authData);
583+
final var isOriginalAuthorizedFuture = provider.allowClusterOperationAsync(clusterName,
584+
clusterOperation, originalRole, authData);
585+
return isRoleAuthorizedFuture.thenCombine(isOriginalAuthorizedFuture,
586+
(isRoleAuthorized, isOriginalAuthorized) -> isRoleAuthorized && isOriginalAuthorized);
587+
} else {
588+
return provider.allowClusterOperationAsync(clusterName, clusterOperation, role, authData);
589+
}
590+
}
591+
592+
public CompletableFuture<Boolean> allowClusterPolicyOperationAsync(String clusterName,
593+
PolicyName policy,
594+
PolicyOperation operation,
595+
String originalRole,
596+
String role,
597+
AuthenticationDataSource authData) {
598+
if (!isValidOriginalPrincipal(role, originalRole, authData)) {
599+
return CompletableFuture.completedFuture(false);
600+
}
601+
602+
if (isProxyRole(role)) {
603+
final var isRoleAuthorizedFuture = provider.allowClusterPolicyOperationAsync(clusterName, role,
604+
policy, operation, authData);
605+
final var isOriginalAuthorizedFuture = provider.allowClusterPolicyOperationAsync(clusterName, originalRole,
606+
policy, operation, authData);
607+
return isRoleAuthorizedFuture.thenCombine(isOriginalAuthorizedFuture,
608+
(isRoleAuthorized, isOriginalAuthorized) -> isRoleAuthorized && isOriginalAuthorized);
609+
} else {
610+
return provider.allowClusterPolicyOperationAsync(clusterName, role, policy, operation, authData);
611+
}
612+
}
613+
614+
570615
/**
571616
* @deprecated - will be removed after 2.12. Use async variant.
572617
*/

pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.pulsar.common.policies.data.AuthAction;
4242
import org.apache.pulsar.common.policies.data.AuthPolicies;
4343
import org.apache.pulsar.common.policies.data.BrokerOperation;
44+
import org.apache.pulsar.common.policies.data.ClusterOperation;
4445
import org.apache.pulsar.common.policies.data.NamespaceOperation;
4546
import org.apache.pulsar.common.policies.data.PolicyName;
4647
import org.apache.pulsar.common.policies.data.PolicyOperation;
@@ -860,4 +861,18 @@ public CompletableFuture<Map<String, Set<AuthAction>>> getPermissionsAsync(Names
860861
});
861862
});
862863
}
864+
865+
@Override
866+
public CompletableFuture<Boolean> allowClusterOperationAsync(String clusterName, ClusterOperation clusterOperation,
867+
String role, AuthenticationDataSource authData) {
868+
return isSuperUser(role, authData, conf);
869+
}
870+
871+
@Override
872+
public CompletableFuture<Boolean> allowClusterPolicyOperationAsync(String clusterName, String role,
873+
PolicyName policy,
874+
PolicyOperation operation,
875+
AuthenticationDataSource authData) {
876+
return isSuperUser(role, authData, conf);
877+
}
863878
}

0 commit comments

Comments
 (0)