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

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


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 47232c7fe5a [fix][broker] Avoid pass null role in 
MultiRolesTokenAuthorizationProvider (#21486)
47232c7fe5a is described below

commit 47232c7fe5a636aeb3229b1c4545b5e38e7ae971
Author: Qiang Zhao <[email protected]>
AuthorDate: Thu Nov 2 16:33:30 2023 +0800

    [fix][broker] Avoid pass null role in MultiRolesTokenAuthorizationProvider 
(#21486)
    
    Co-authored-by: Jiwe Guo <[email protected]>
---
 .../MultiRolesTokenAuthorizationProvider.java      |  9 +++++-
 .../MultiRolesTokenAuthorizationProviderTest.java  | 35 +++++++++++++++++++++-
 2 files changed, 42 insertions(+), 2 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 7d17d180cf1..fdab233a510 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
@@ -183,7 +183,14 @@ public class MultiRolesTokenAuthorizationProvider extends 
PulsarAuthorizationPro
 
         Jwt<?, Claims> jwt = parser.parseClaimsJwt(unsignedToken);
         try {
-            return new 
HashSet<>(Collections.singletonList(jwt.getBody().get(roleClaim, 
String.class)));
+            final String jwtRole = jwt.getBody().get(roleClaim, String.class);
+            if (jwtRole == null) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Do not have corresponding claim in jwt token. 
claim={}", roleClaim);
+                }
+                return Collections.emptySet();
+            }
+            return new HashSet<>(Collections.singletonList(jwtRole));
         } catch (RequiredTypeException requiredTypeException) {
             try {
                 List list = jwt.getBody().get(roleClaim, List.class);
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 c4fc35f6401..ed9626dffe2 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
@@ -32,7 +32,6 @@ import 
org.apache.pulsar.broker.authentication.AuthenticationDataSubscription;
 import org.apache.pulsar.broker.authentication.utils.AuthTokenUtils;
 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;
@@ -144,6 +143,40 @@ public class MultiRolesTokenAuthorizationProviderTest {
         }).get());
     }
 
+    @Test
+    public void testMultiRolesAuthzWithoutClaim() throws Exception {
+        final SecretKey secretKey = 
AuthTokenUtils.createSecretKey(SignatureAlgorithm.HS256);
+        final String testRole = "test-role";
+        // broker will use "sub" as the claim by default.
+        final String token = Jwts.builder()
+                .claim("whatever", testRole).signWith(secretKey).compact();
+        ServiceConfiguration conf = new ServiceConfiguration();
+        final MultiRolesTokenAuthorizationProvider provider = new 
MultiRolesTokenAuthorizationProvider();
+        provider.initialize(conf, mock(PulsarResources.class));
+        final 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");
+                }
+            }
+        };
+
+        assertFalse(provider.authorize("test", ads, role -> {
+            if (role == null) {
+                throw new IllegalStateException("We should avoid pass null to 
sub providers");
+            }
+            return CompletableFuture.completedFuture(role.equals(testRole));
+        }).get());
+    }
+
     @Test
     public void testMultiRolesAuthzWithAnonymousUser() throws Exception {
         @Cleanup

Reply via email to