This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/pulsar.git

commit 031809ed100a941ca4556e2d43c7c83f5de0ab1a
Author: Guangning E <[email protected]>
AuthorDate: Fri Aug 11 23:21:32 2023 +0800

    [fix][broker]Check that the super user role is in the 
MultiRolesTokenAuthorizationProvider plugin (#20939)
    
    Fixed https://github.com/apache/pulsar/issues/20938
---
 .../MultiRolesTokenAuthorizationProvider.java      | 13 +++++----
 .../MultiRolesTokenAuthorizationProviderTest.java  | 32 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 5 deletions(-)

diff --git 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java
 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java
index fa613245cfa..db5f4f18e8c 100644
--- 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java
+++ 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProvider.java
@@ -89,15 +89,18 @@ public class MultiRolesTokenAuthorizationProvider extends 
PulsarAuthorizationPro
     @Override
     public CompletableFuture<Boolean> isSuperUser(String role, 
AuthenticationDataSource authenticationData,
                                                   ServiceConfiguration 
serviceConfiguration) {
-        Set<String> roles = getRoles(authenticationData);
-        if (roles.isEmpty()) {
-            return CompletableFuture.completedFuture(false);
-        }
+        // if superUser role contains in config, return true.
         Set<String> superUserRoles = serviceConfiguration.getSuperUserRoles();
         if (superUserRoles.isEmpty()) {
             return CompletableFuture.completedFuture(false);
         }
-
+        if (role != null && superUserRoles.contains(role)) {
+            return CompletableFuture.completedFuture(true);
+        }
+        Set<String> roles = getRoles(authenticationData);
+        if (roles.isEmpty()) {
+            return CompletableFuture.completedFuture(false);
+        }
         return 
CompletableFuture.completedFuture(roles.stream().anyMatch(superUserRoles::contains));
     }
 
diff --git 
a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProviderTest.java
 
b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProviderTest.java
index 7e329d14307..f0a857bdd69 100644
--- 
a/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProviderTest.java
+++ 
b/pulsar-broker-common/src/test/java/org/apache/pulsar/broker/authorization/MultiRolesTokenAuthorizationProviderTest.java
@@ -31,6 +31,7 @@ import org.apache.pulsar.broker.resources.PulsarResources;
 import org.testng.annotations.Test;
 
 import javax.crypto.SecretKey;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 
 public class MultiRolesTokenAuthorizationProviderTest {
@@ -198,4 +199,35 @@ public class MultiRolesTokenAuthorizationProviderTest {
             return CompletableFuture.completedFuture(false);
         }).get());
     }
+
+    @Test
+    public void testMultiRolesAuthzWithSuperUser() throws Exception {
+        SecretKey secretKey = 
AuthTokenUtils.createSecretKey(SignatureAlgorithm.HS256);
+        String testAdminRole = "admin";
+        String token = Jwts.builder().claim("sub", 
testAdminRole).signWith(secretKey).compact();
+
+        ServiceConfiguration conf = new ServiceConfiguration();
+        conf.setSuperUserRoles(Set.of(testAdminRole));
+
+        MultiRolesTokenAuthorizationProvider provider = new 
MultiRolesTokenAuthorizationProvider();
+        provider.initialize(conf, mock(PulsarResources.class));
+
+        AuthenticationDataSource ads = new AuthenticationDataSource() {
+            @Override
+            public boolean hasDataFromHttp() {
+                return true;
+            }
+
+            @Override
+            public String getHttpHeader(String name) {
+                if (name.equals("Authorization")) {
+                    return "Bearer " + token;
+                } else {
+                    throw new IllegalArgumentException("Wrong HTTP header");
+                }
+            }
+        };
+
+        assertTrue(provider.isSuperUser(testAdminRole, ads, conf).get());
+    }
 }

Reply via email to