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

suneet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new e6c9142  Add validation for authenticator and authorizer name (#10106)
e6c9142 is described below

commit e6c9142129f1462feabefb4b13aa8a037fbe793f
Author: Suneet Saldanha <[email protected]>
AuthorDate: Mon Jul 13 21:15:54 2020 -0700

    Add validation for authenticator and authorizer name (#10106)
    
    * Add validation for authorizer name
    
    * fix deps
    
    * add javadocs
    
    * Do not use resource filters
    
    * Fix BasicAuthenticatorResource as well
    
    * Add integration tests
    
    * fix test
    
    * fix
---
 .../TaskIdUtils.java => common/utils/IdUtils.java} |   6 +-
 .../utils/IdUtilsTest.java}                        |  24 +-
 extensions-core/druid-basic-security/pom.xml       |   5 +
 .../endpoint/BasicAuthenticatorResource.java       |  13 +-
 .../endpoint/BasicAuthorizerResource.java          |  29 +-
 .../CoordinatorBasicAuthenticatorResourceTest.java |  10 +-
 .../CoordinatorBasicAuthorizerResourceTest.java    |  16 +-
 .../endpoint/BasicAuthenticatorResourceTest.java   | 147 +++++++++
 .../endpoint/BasicAuthorizerResourceTest.java      | 337 +++++++++++++++++++++
 .../druid/indexing/kafka/KafkaConsumerConfigs.java |   4 +-
 .../indexing/kafka/supervisor/KafkaSupervisor.java |   4 +-
 .../kinesis/supervisor/KinesisSupervisor.java      |   4 +-
 .../druid/indexing/common/task/AbstractTask.java   |   4 +-
 .../overlord/http/security/TaskResourceFilter.java |   4 +-
 .../indexing/worker/IntermediaryDataManager.java   |   6 +-
 .../druid/indexing/worker/http/WorkerResource.java |   4 +-
 .../druid/testing/utils/KafkaEventWriter.java      |   4 +-
 .../security/ITBasicAuthConfigurationTest.java     |  47 +++
 .../apache/druid/segment/indexing/DataSchema.java  |   4 +-
 .../initialization/AuthorizerMapperModule.java     |   9 +-
 .../druid/server/security/AuthValidator.java       |  53 ++++
 .../druid/segment/indexing/DataSchemaTest.java     |  22 +-
 .../initialization/AuthorizerMapperModuleTest.java |  61 ++++
 .../druid/server/security/AuthValidatorTest.java   |  99 ++++++
 24 files changed, 859 insertions(+), 57 deletions(-)

diff --git a/core/src/main/java/org/apache/druid/indexer/TaskIdUtils.java 
b/core/src/main/java/org/apache/druid/common/utils/IdUtils.java
similarity index 95%
rename from core/src/main/java/org/apache/druid/indexer/TaskIdUtils.java
rename to core/src/main/java/org/apache/druid/common/utils/IdUtils.java
index 76317d9..f0f4ef9 100644
--- a/core/src/main/java/org/apache/druid/indexer/TaskIdUtils.java
+++ b/core/src/main/java/org/apache/druid/common/utils/IdUtils.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.druid.indexer;
+package org.apache.druid.common.utils;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -28,7 +28,7 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class TaskIdUtils
+public class IdUtils
 {
   private static final Pattern INVALIDCHARS = Pattern.compile("(?s).*[^\\S 
].*");
 
@@ -66,6 +66,6 @@ public class TaskIdUtils
 
   public static String getRandomIdWithPrefix(String prefix)
   {
-    return UNDERSCORE_JOINER.join(prefix, TaskIdUtils.getRandomId());
+    return UNDERSCORE_JOINER.join(prefix, IdUtils.getRandomId());
   }
 }
diff --git a/core/src/test/java/org/apache/druid/indexer/TaskIdUtilsTest.java 
b/core/src/test/java/org/apache/druid/common/utils/IdUtilsTest.java
similarity index 83%
rename from core/src/test/java/org/apache/druid/indexer/TaskIdUtilsTest.java
rename to core/src/test/java/org/apache/druid/common/utils/IdUtilsTest.java
index 5fed8fb..2adbd49 100644
--- a/core/src/test/java/org/apache/druid/indexer/TaskIdUtilsTest.java
+++ b/core/src/test/java/org/apache/druid/common/utils/IdUtilsTest.java
@@ -17,13 +17,13 @@
  * under the License.
  */
 
-package org.apache.druid.indexer;
+package org.apache.druid.common.utils;
 
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
-public class TaskIdUtilsTest
+public class IdUtilsTest
 {
   private static final String THINGO = "thingToValidate";
   public static final String VALID_ID_CHARS = "alpha123..*~!@#&%^&*()-+ 
Россия\\ 한국 中国!";
@@ -34,7 +34,7 @@ public class TaskIdUtilsTest
   @Test
   public void testValidIdName()
   {
-    TaskIdUtils.validateId(THINGO, VALID_ID_CHARS);
+    IdUtils.validateId(THINGO, VALID_ID_CHARS);
   }
 
   @Test
@@ -42,7 +42,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot be null or empty. 
Please provide a thingToValidate.");
-    TaskIdUtils.validateId(THINGO, null);
+    IdUtils.validateId(THINGO, null);
   }
 
   @Test
@@ -50,7 +50,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot be null or empty. 
Please provide a thingToValidate.");
-    TaskIdUtils.validateId(THINGO, "");
+    IdUtils.validateId(THINGO, "");
   }
 
   @Test
@@ -58,7 +58,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot contain the '/' 
character.");
-    TaskIdUtils.validateId(THINGO, 
"/paths/are/bad/since/we/make/files/from/stuff");
+    IdUtils.validateId(THINGO, 
"/paths/are/bad/since/we/make/files/from/stuff");
   }
 
   @Test
@@ -66,7 +66,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot start with the '.' 
character.");
-    TaskIdUtils.validateId(THINGO, "./nice/try");
+    IdUtils.validateId(THINGO, "./nice/try");
   }
 
   @Test
@@ -74,7 +74,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot contain whitespace 
character except space.");
-    TaskIdUtils.validateId(THINGO, 
"spaces\tare\tbetter\tthan\ttabs\twhich\tare\tillegal");
+    IdUtils.validateId(THINGO, 
"spaces\tare\tbetter\tthan\ttabs\twhich\tare\tillegal");
   }
 
   @Test
@@ -82,7 +82,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot contain whitespace 
character except space.");
-    TaskIdUtils.validateId(THINGO, "new\nline");
+    IdUtils.validateId(THINGO, "new\nline");
   }
 
   @Test
@@ -90,7 +90,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot contain whitespace 
character except space.");
-    TaskIdUtils.validateId(THINGO, "does\rexist\rby\ritself");
+    IdUtils.validateId(THINGO, "does\rexist\rby\ritself");
   }
 
   @Test
@@ -98,7 +98,7 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot contain whitespace 
character except space.");
-    TaskIdUtils.validateId(THINGO, "wtf\u000Bis line tabulation");
+    IdUtils.validateId(THINGO, "wtf\u000Bis line tabulation");
   }
 
   @Test
@@ -106,6 +106,6 @@ public class TaskIdUtilsTest
   {
     expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("thingToValidate cannot contain whitespace 
character except space.");
-    TaskIdUtils.validateId(THINGO, "form\u000cfeed?");
+    IdUtils.validateId(THINGO, "form\u000cfeed?");
   }
 }
diff --git a/extensions-core/druid-basic-security/pom.xml 
b/extensions-core/druid-basic-security/pom.xml
index 16f6d5d..0ac8820 100644
--- a/extensions-core/druid-basic-security/pom.xml
+++ b/extensions-core/druid-basic-security/pom.xml
@@ -133,6 +133,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.easymock</groupId>
       <artifactId>easymock</artifactId>
       <scope>test</scope>
diff --git 
a/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResource.java
 
b/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResource.java
index b14b4fa..23d8316 100644
--- 
a/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResource.java
+++ 
b/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResource.java
@@ -25,6 +25,7 @@ import com.sun.jersey.spi.container.ResourceFilters;
 import org.apache.druid.guice.LazySingleton;
 import org.apache.druid.security.basic.BasicSecurityResourceFilter;
 import 
org.apache.druid.security.basic.authentication.entity.BasicAuthenticatorCredentialUpdate;
+import org.apache.druid.server.security.AuthValidator;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
@@ -43,13 +44,16 @@ import javax.ws.rs.core.Response;
 public class BasicAuthenticatorResource
 {
   private final BasicAuthenticatorResourceHandler handler;
+  private final AuthValidator authValidator;
 
   @Inject
   public BasicAuthenticatorResource(
-      BasicAuthenticatorResourceHandler handler
+      BasicAuthenticatorResourceHandler handler,
+      AuthValidator authValidator
   )
   {
     this.handler = handler;
+    this.authValidator = authValidator;
   }
 
   /**
@@ -102,6 +106,7 @@ public class BasicAuthenticatorResource
       @PathParam("authenticatorName") final String authenticatorName
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.getAllUsers(authenticatorName);
   }
 
@@ -122,6 +127,7 @@ public class BasicAuthenticatorResource
       @PathParam("userName") final String userName
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.getUser(authenticatorName, userName);
   }
 
@@ -144,6 +150,7 @@ public class BasicAuthenticatorResource
       @PathParam("userName") String userName
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.createUser(authenticatorName, userName);
   }
 
@@ -166,6 +173,7 @@ public class BasicAuthenticatorResource
       @PathParam("userName") String userName
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.deleteUser(authenticatorName, userName);
   }
 
@@ -189,6 +197,7 @@ public class BasicAuthenticatorResource
       BasicAuthenticatorCredentialUpdate update
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.updateUserCredentials(authenticatorName, userName, update);
   }
 
@@ -207,6 +216,7 @@ public class BasicAuthenticatorResource
       @PathParam("authenticatorName") final String authenticatorName
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.getCachedSerializedUserMap(authenticatorName);
   }
 
@@ -224,6 +234,7 @@ public class BasicAuthenticatorResource
       byte[] serializedUserMap
   )
   {
+    authValidator.validateAuthenticatorName(authenticatorName);
     return handler.authenticatorUserUpdateListener(authenticatorName, 
serializedUserMap);
   }
 }
diff --git 
a/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResource.java
 
b/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResource.java
index 0e70e5a..cb8a9fa 100644
--- 
a/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResource.java
+++ 
b/extensions-core/druid-basic-security/src/main/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResource.java
@@ -25,6 +25,7 @@ import com.sun.jersey.spi.container.ResourceFilters;
 import org.apache.druid.guice.LazySingleton;
 import org.apache.druid.security.basic.BasicSecurityResourceFilter;
 import 
org.apache.druid.security.basic.authorization.entity.BasicAuthorizerGroupMapping;
+import org.apache.druid.server.security.AuthValidator;
 import org.apache.druid.server.security.ResourceAction;
 
 import javax.servlet.http.HttpServletRequest;
@@ -46,13 +47,16 @@ import java.util.List;
 public class BasicAuthorizerResource
 {
   private final BasicAuthorizerResourceHandler resourceHandler;
+  private final AuthValidator authValidator;
 
   @Inject
   public BasicAuthorizerResource(
-      BasicAuthorizerResourceHandler resourceHandler
+      BasicAuthorizerResourceHandler resourceHandler,
+      AuthValidator authValidator
   )
   {
     this.resourceHandler = resourceHandler;
+    this.authValidator = authValidator;
   }
 
   /**
@@ -106,6 +110,7 @@ public class BasicAuthorizerResource
       @PathParam("authorizerName") final String authorizerName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getAllUsers(authorizerName);
   }
 
@@ -124,6 +129,7 @@ public class BasicAuthorizerResource
       @PathParam("authorizerName") final String authorizerName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getAllGroupMappings(authorizerName);
   }
 
@@ -146,6 +152,7 @@ public class BasicAuthorizerResource
       @QueryParam("simplifyPermissions") String simplifyPermissions
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getUser(authorizerName, userName, full != null, 
simplifyPermissions != null);
   }
 
@@ -167,6 +174,7 @@ public class BasicAuthorizerResource
       @QueryParam("full") String full
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getGroupMapping(authorizerName, groupMappingName, 
full != null);
   }
 
@@ -189,6 +197,7 @@ public class BasicAuthorizerResource
       @PathParam("userName") String userName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.createUser(authorizerName, userName);
   }
 
@@ -211,6 +220,7 @@ public class BasicAuthorizerResource
       @PathParam("userName") String userName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.deleteUser(authorizerName, userName);
   }
 
@@ -234,6 +244,7 @@ public class BasicAuthorizerResource
       BasicAuthorizerGroupMapping groupMapping
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.createGroupMapping(
         authorizerName,
         new BasicAuthorizerGroupMapping(groupMappingName, 
groupMapping.getGroupPattern(), groupMapping.getRoles())
@@ -259,6 +270,7 @@ public class BasicAuthorizerResource
       @PathParam("groupMappingName") String groupMappingName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.deleteGroupMapping(authorizerName, 
groupMappingName);
   }
 
@@ -277,6 +289,7 @@ public class BasicAuthorizerResource
       @PathParam("authorizerName") final String authorizerName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getAllRoles(authorizerName);
   }
 
@@ -301,6 +314,7 @@ public class BasicAuthorizerResource
       @QueryParam("simplifyPermissions") String simplifyPermissions
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getRole(authorizerName, roleName, full != null, 
simplifyPermissions != null);
   }
 
@@ -323,6 +337,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") final String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.createRole(authorizerName, roleName);
   }
 
@@ -345,6 +360,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.deleteRole(authorizerName, roleName);
   }
 
@@ -369,6 +385,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.assignRoleToUser(authorizerName, userName, 
roleName);
   }
 
@@ -393,6 +410,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.unassignRoleFromUser(authorizerName, userName, 
roleName);
   }
 
@@ -417,6 +435,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.assignRoleToGroupMapping(authorizerName, 
groupMappingName, roleName);
   }
 
@@ -441,6 +460,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.unassignRoleFromGroupMapping(authorizerName, 
groupMappingName, roleName);
   }
 
@@ -465,6 +485,7 @@ public class BasicAuthorizerResource
       List<ResourceAction> permissions
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.setRolePermissions(authorizerName, roleName, 
permissions);
   }
 
@@ -487,6 +508,7 @@ public class BasicAuthorizerResource
       @PathParam("roleName") String roleName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getRolePermissions(authorizerName, roleName);
   }
 
@@ -505,6 +527,7 @@ public class BasicAuthorizerResource
       @PathParam("authorizerName") final String authorizerName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getCachedUserMaps(authorizerName);
   }
 
@@ -523,6 +546,7 @@ public class BasicAuthorizerResource
       @PathParam("authorizerName") final String authorizerName
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.getCachedGroupMappingMaps(authorizerName);
   }
 
@@ -544,6 +568,7 @@ public class BasicAuthorizerResource
       byte[] serializedUserAndRoleMap
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.authorizerUserUpdateListener(authorizerName, 
serializedUserAndRoleMap);
   }
 
@@ -561,6 +586,7 @@ public class BasicAuthorizerResource
       byte[] serializedUserAndRoleMap
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return resourceHandler.authorizerUserUpdateListener(authorizerName, 
serializedUserAndRoleMap);
   }
 
@@ -578,6 +604,7 @@ public class BasicAuthorizerResource
       byte[] serializedGroupMappingAndRoleMap
   )
   {
+    authValidator.validateAuthorizerName(authorizerName);
     return 
resourceHandler.authorizerGroupMappingUpdateListener(authorizerName, 
serializedGroupMappingAndRoleMap);
   }
 }
diff --git 
a/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authentication/CoordinatorBasicAuthenticatorResourceTest.java
 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authentication/CoordinatorBasicAuthenticatorResourceTest.java
index cce1b24..b383a6d 100644
--- 
a/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authentication/CoordinatorBasicAuthenticatorResourceTest.java
+++ 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authentication/CoordinatorBasicAuthenticatorResourceTest.java
@@ -35,6 +35,7 @@ import 
org.apache.druid.security.basic.authentication.endpoint.CoordinatorBasicA
 import 
org.apache.druid.security.basic.authentication.entity.BasicAuthenticatorCredentialUpdate;
 import 
org.apache.druid.security.basic.authentication.entity.BasicAuthenticatorCredentials;
 import 
org.apache.druid.security.basic.authentication.entity.BasicAuthenticatorUser;
+import org.apache.druid.server.security.AuthValidator;
 import org.apache.druid.server.security.AuthenticatorMapper;
 import org.easymock.EasyMock;
 import org.junit.After;
@@ -43,12 +44,16 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.Response;
 import java.util.Map;
 import java.util.Set;
 
+@RunWith(MockitoJUnitRunner.class)
 public class CoordinatorBasicAuthenticatorResourceTest
 {
   private static final String AUTHENTICATOR_NAME = "test";
@@ -61,6 +66,8 @@ public class CoordinatorBasicAuthenticatorResourceTest
   @Rule
   public final TestDerbyConnector.DerbyConnectorRule derbyConnectorRule = new 
TestDerbyConnector.DerbyConnectorRule();
 
+  @Mock
+  private AuthValidator authValidator;
   private BasicAuthenticatorResource resource;
   private CoordinatorBasicAuthenticatorMetadataStorageUpdater storageUpdater;
   private HttpServletRequest req;
@@ -137,7 +144,8 @@ public class CoordinatorBasicAuthenticatorResourceTest
             storageUpdater,
             authenticatorMapper,
             objectMapper
-        )
+        ),
+        authValidator
     );
 
     storageUpdater.start();
diff --git 
a/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authorization/CoordinatorBasicAuthorizerResourceTest.java
 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authorization/CoordinatorBasicAuthorizerResourceTest.java
index bdaf8e6..746d333 100644
--- 
a/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authorization/CoordinatorBasicAuthorizerResourceTest.java
+++ 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/authorization/CoordinatorBasicAuthorizerResourceTest.java
@@ -45,17 +45,20 @@ import 
org.apache.druid.security.basic.authorization.entity.BasicAuthorizerUser;
 import 
org.apache.druid.security.basic.authorization.entity.BasicAuthorizerUserFull;
 import 
org.apache.druid.security.basic.authorization.entity.BasicAuthorizerUserFullSimplifiedPermissions;
 import org.apache.druid.server.security.Action;
+import org.apache.druid.server.security.AuthValidator;
 import org.apache.druid.server.security.AuthorizerMapper;
 import org.apache.druid.server.security.Resource;
 import org.apache.druid.server.security.ResourceAction;
 import org.apache.druid.server.security.ResourceType;
-import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.Response;
@@ -68,6 +71,7 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 
+@RunWith(MockitoJUnitRunner.class)
 public class CoordinatorBasicAuthorizerResourceTest
 {
   private static final String AUTHORIZER_NAME = "test";
@@ -79,18 +83,19 @@ public class CoordinatorBasicAuthorizerResourceTest
 
   @Rule
   public final TestDerbyConnector.DerbyConnectorRule derbyConnectorRule = new 
TestDerbyConnector.DerbyConnectorRule();
+  @Mock
+  private AuthValidator authValidator;
+  @Mock
+  private HttpServletRequest req;
 
   private TestDerbyConnector connector;
   private MetadataStorageTablesConfig tablesConfig;
   private BasicAuthorizerResource resource;
   private CoordinatorBasicAuthorizerMetadataStorageUpdater storageUpdater;
-  private HttpServletRequest req;
 
   @Before
   public void setUp()
   {
-    req = EasyMock.createStrictMock(HttpServletRequest.class);
-
     connector = derbyConnectorRule.getConnector();
     tablesConfig = derbyConnectorRule.metadataTablesConfigSupplier().get();
     connector.createConfigTable();
@@ -148,7 +153,8 @@ public class CoordinatorBasicAuthorizerResourceTest
             storageUpdater,
             authorizerMapper,
             new ObjectMapper(new SmileFactory())
-        )
+        ),
+        authValidator
     );
 
     storageUpdater.start();
diff --git 
a/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResourceTest.java
 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResourceTest.java
new file mode 100644
index 0000000..fc403b0
--- /dev/null
+++ 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/basic/authentication/endpoint/BasicAuthenticatorResourceTest.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.security.basic.authentication.endpoint;
+
+import 
org.apache.druid.security.basic.authentication.entity.BasicAuthenticatorCredentialUpdate;
+import org.apache.druid.server.security.AuthValidator;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import javax.servlet.http.HttpServletRequest;
+import java.nio.charset.StandardCharsets;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BasicAuthenticatorResourceTest
+{
+  private static final String AUTHENTICATOR_NAME = "AUTHENTICATOR_NAME";
+  private static final String INVALID_AUTHENTICATOR_NAME = 
"INVALID_AUTHENTICATOR_NAME";
+  private static final String USER_NAME = "USER_NAME";
+  private static final byte[] SERIALIZED_USER_MAP = 
"SERIALIZED_USER_MAP".getBytes(StandardCharsets.UTF_8);
+  @Mock(answer = Answers.RETURNS_MOCKS)
+  private BasicAuthenticatorResourceHandler handler;
+  @Mock
+  private AuthValidator authValidator;
+  @Mock
+  private HttpServletRequest req;
+  @Mock
+  private BasicAuthenticatorCredentialUpdate update;
+
+  private BasicAuthenticatorResource target;
+
+  @Before
+  public void setUp()
+  {
+    Mockito.doThrow(IllegalArgumentException.class)
+           .when(authValidator)
+           .validateAuthenticatorName(INVALID_AUTHENTICATOR_NAME);
+
+    target = new BasicAuthenticatorResource(handler, authValidator);
+  }
+
+  @Test
+  public void authenticatorUpdateListenerShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.authenticatorUpdateListener(req, 
AUTHENTICATOR_NAME, SERIALIZED_USER_MAP));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
authenticatorUpdateListenerWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.authenticatorUpdateListener(req, INVALID_AUTHENTICATOR_NAME, 
SERIALIZED_USER_MAP);
+  }
+
+  @Test
+  public void getCachedSerializedUserMapShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.getCachedSerializedUserMap(req, 
AUTHENTICATOR_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
getCachedSerializedUserMapWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.getCachedSerializedUserMap(req, INVALID_AUTHENTICATOR_NAME);
+  }
+
+  @Test
+  public void updateUserCredentialsShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.updateUserCredentials(req, AUTHENTICATOR_NAME, 
USER_NAME, update));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
updateUserCredentialsWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.updateUserCredentials(req, INVALID_AUTHENTICATOR_NAME, USER_NAME, 
update);
+  }
+
+  @Test
+  public void deleteUserShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.deleteUser(req, AUTHENTICATOR_NAME, 
USER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
deleteUserWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.deleteUser(req, INVALID_AUTHENTICATOR_NAME, USER_NAME);
+  }
+
+  @Test
+  public void createUserShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.createUser(req, AUTHENTICATOR_NAME, 
USER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
createUserWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.createUser(req, INVALID_AUTHENTICATOR_NAME, USER_NAME);
+  }
+
+  @Test
+  public void getUserShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.getUser(req, AUTHENTICATOR_NAME, USER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void getUserWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.getUser(req, INVALID_AUTHENTICATOR_NAME, USER_NAME);
+  }
+
+  @Test
+  public void getAllUsersShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.getAllUsers(req, AUTHENTICATOR_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
getAllUsersWithInvalidAuthenticatorNameShouldReturnExpectedResponse()
+  {
+    target.getAllUsers(req, INVALID_AUTHENTICATOR_NAME);
+  }
+}
diff --git 
a/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResourceTest.java
 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResourceTest.java
new file mode 100644
index 0000000..de0bf1d
--- /dev/null
+++ 
b/extensions-core/druid-basic-security/src/test/java/org/apache/druid/security/basic/authorization/endpoint/BasicAuthorizerResourceTest.java
@@ -0,0 +1,337 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.security.basic.authorization.endpoint;
+
+import com.google.common.collect.ImmutableList;
+import 
org.apache.druid.security.basic.authorization.entity.BasicAuthorizerGroupMapping;
+import org.apache.druid.server.security.AuthValidator;
+import org.apache.druid.server.security.ResourceAction;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import javax.servlet.http.HttpServletRequest;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BasicAuthorizerResourceTest
+{
+  private static final String AUTHORIZER_NAME = "AUTHORIZER_NAME";
+  private static final String INVALID_AUTHORIZER_NAME = 
"INVALID_AUTHORIZER_NAME";
+  private static final String USER_NAME = "USER_NAME";
+  private static final String GROUP_MAPPING_NAME = "GROUP_MAPPING_NAME";
+  private static final String ROLE_NAME = "ROLE_NAME";
+  private static final byte[] SERIALIZED_ROLE_MAP = 
"SERIALIZED_ROLE_MAP".getBytes(StandardCharsets.UTF_8);
+
+  @Mock(answer = Answers.RETURNS_MOCKS)
+  private BasicAuthorizerResourceHandler resourceHandler;
+  @Mock
+  private AuthValidator authValidator;
+  @Mock(answer = Answers.RETURNS_MOCKS)
+  private BasicAuthorizerGroupMapping groupMapping;
+  @Mock
+  private ResourceAction resourceAction;
+  private List<ResourceAction> resourceActions;
+  @Mock
+  private HttpServletRequest req;
+
+  private BasicAuthorizerResource target;
+
+  @Before
+  public void setUp()
+  {
+    resourceActions = ImmutableList.of(resourceAction);
+    Mockito.doThrow(IllegalArgumentException.class)
+           .when(authValidator)
+           .validateAuthorizerName(INVALID_AUTHORIZER_NAME);
+
+    target = new BasicAuthorizerResource(resourceHandler, authValidator);
+  }
+
+  @Test
+  public void getAllUsersShouldReturnExpectedUsers()
+  {
+    Assert.assertNotNull(target.getAllUsers(req, AUTHORIZER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void getAllUsersWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getAllUsers(req, INVALID_AUTHORIZER_NAME);
+  }
+
+  @Test
+  public void getAllGroupMappingsShouldReturnExpectedGroupMappings()
+  {
+    Assert.assertNotNull(target.getAllGroupMappings(req, AUTHORIZER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
getAllGroupMappingsWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getAllGroupMappings(req, INVALID_AUTHORIZER_NAME);
+  }
+
+  @Test
+  public void getUserShouldReturnExpectedUser()
+  {
+    Assert.assertNotNull(target.getUser(req, AUTHORIZER_NAME, USER_NAME, null, 
null));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void getUserWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getUser(req, INVALID_AUTHORIZER_NAME, USER_NAME, null, null);
+  }
+
+  @Test
+  public void getGroupMappingShouldReturnExpectedGroupMapping()
+  {
+    Assert.assertNotNull(target.getGroupMapping(req, AUTHORIZER_NAME, 
GROUP_MAPPING_NAME, null));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void getGroupMappingWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getGroupMapping(req, INVALID_AUTHORIZER_NAME, GROUP_MAPPING_NAME, 
null);
+  }
+
+  @Test
+  public void createUserShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.createUser(req, AUTHORIZER_NAME, USER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void createUserWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.createUser(req, INVALID_AUTHORIZER_NAME, USER_NAME);
+  }
+
+  @Test
+  public void deleteUserShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.deleteUser(req, AUTHORIZER_NAME, USER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void deleteUserWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.deleteUser(req, INVALID_AUTHORIZER_NAME, USER_NAME);
+  }
+
+  @Test
+  public void createGroupMappingShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.createGroupMapping(req, AUTHORIZER_NAME, 
GROUP_MAPPING_NAME, groupMapping));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void createGroupMappingWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.createGroupMapping(req, INVALID_AUTHORIZER_NAME, 
GROUP_MAPPING_NAME, groupMapping);
+  }
+
+  @Test
+  public void deleteGroupMappingShouldReturnExpectedResponse()
+  {
+    Assert.assertNotNull(target.deleteGroupMapping(req, AUTHORIZER_NAME, 
GROUP_MAPPING_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void deleteGroupMappingWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.deleteGroupMapping(req, INVALID_AUTHORIZER_NAME, 
GROUP_MAPPING_NAME);
+  }
+
+  @Test
+  public void getRoleShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.getRole(req, AUTHORIZER_NAME, ROLE_NAME, null, 
null));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void getRoleWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getRole(req, INVALID_AUTHORIZER_NAME, ROLE_NAME, null, null);
+  }
+
+  @Test
+  public void createRoleShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.createRole(req, AUTHORIZER_NAME, ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void createRoleWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.createRole(req, INVALID_AUTHORIZER_NAME, ROLE_NAME);
+  }
+
+  @Test
+  public void deleteRoleShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.deleteRole(req, AUTHORIZER_NAME, ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void deleteRoleWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.deleteRole(req, INVALID_AUTHORIZER_NAME, ROLE_NAME);
+  }
+
+  @Test
+  public void assignRoleToUserShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.assignRoleToUser(req, AUTHORIZER_NAME, 
USER_NAME, ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void assignRoleToUserWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.assignRoleToUser(req, INVALID_AUTHORIZER_NAME, USER_NAME, 
ROLE_NAME);
+  }
+
+  @Test
+  public void unassignRoleFromUserShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.unassignRoleFromUser(req, AUTHORIZER_NAME, 
USER_NAME, ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
unassignRoleFromUserWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.unassignRoleFromUser(req, INVALID_AUTHORIZER_NAME, USER_NAME, 
ROLE_NAME);
+  }
+
+  @Test
+  public void assignRoleToGroupMappingShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.assignRoleToGroupMapping(req, AUTHORIZER_NAME, 
GROUP_MAPPING_NAME, ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
assignRoleToGroupMappingWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.assignRoleToGroupMapping(req, INVALID_AUTHORIZER_NAME, 
GROUP_MAPPING_NAME, ROLE_NAME);
+  }
+
+  @Test
+  public void unassignRoleFromGroupMappingShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.unassignRoleFromGroupMapping(req, 
AUTHORIZER_NAME, GROUP_MAPPING_NAME, ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
unassignRoleFromGroupMappingWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.unassignRoleFromGroupMapping(req, INVALID_AUTHORIZER_NAME, 
GROUP_MAPPING_NAME, ROLE_NAME);
+  }
+
+  @Test
+  public void setRolePermissionsShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.setRolePermissions(req, AUTHORIZER_NAME, 
ROLE_NAME, resourceActions));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void setRolePermissionsWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.setRolePermissions(req, INVALID_AUTHORIZER_NAME, ROLE_NAME, 
resourceActions);
+  }
+
+  @Test
+  public void getRolePermissionsShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.getRolePermissions(req, AUTHORIZER_NAME, 
ROLE_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void getRolePermissionsWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getRolePermissions(req, INVALID_AUTHORIZER_NAME, ROLE_NAME);
+  }
+
+  @Test
+  public void getCachedSerializedUserMapShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.getCachedSerializedUserMap(req, 
AUTHORIZER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
getCachedSerializedUserMapWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getCachedSerializedUserMap(req, INVALID_AUTHORIZER_NAME);
+  }
+
+  @Test
+  public void getCachedSerializedGroupMapShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.getCachedSerializedGroupMap(req, 
AUTHORIZER_NAME));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
getCachedSerializedGroupMapWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.getCachedSerializedGroupMap(req, INVALID_AUTHORIZER_NAME);
+  }
+
+  @Test
+  public void authorizerUpdateListenerShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.authorizerUpdateListener(req, AUTHORIZER_NAME, 
SERIALIZED_ROLE_MAP));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
authorizerUpdateListenerWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.authorizerUpdateListener(req, INVALID_AUTHORIZER_NAME, 
SERIALIZED_ROLE_MAP);
+  }
+
+  @Test
+  public void authorizerUserUpdateListenerShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.authorizerUserUpdateListener(req, 
AUTHORIZER_NAME, SERIALIZED_ROLE_MAP));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
authorizerUserUpdateListenerWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.authorizerUserUpdateListener(req, INVALID_AUTHORIZER_NAME, 
SERIALIZED_ROLE_MAP);
+  }
+
+  @Test
+  public void authorizerGroupMappingUpdateListenerShouldReturnExpectedResult()
+  {
+    Assert.assertNotNull(target.authorizerGroupMappingUpdateListener(req, 
AUTHORIZER_NAME, SERIALIZED_ROLE_MAP));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void 
authorizerGroupMappingUpdateListenerWithInvalidAuthorizerNameShouldThrowException()
+  {
+    target.authorizerGroupMappingUpdateListener(req, INVALID_AUTHORIZER_NAME, 
SERIALIZED_ROLE_MAP);
+  }
+}
diff --git 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaConsumerConfigs.java
 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaConsumerConfigs.java
index 7339d26..e9c6e79 100644
--- 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaConsumerConfigs.java
+++ 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaConsumerConfigs.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.indexing.kafka;
 
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.java.util.common.StringUtils;
 
 import java.util.HashMap;
@@ -35,7 +35,7 @@ public class KafkaConsumerConfigs
   {
     final Map<String, Object> props = new HashMap<>();
     props.put("metadata.max.age.ms", "10000");
-    props.put("group.id", StringUtils.format("kafka-supervisor-%s", 
TaskIdUtils.getRandomId()));
+    props.put("group.id", StringUtils.format("kafka-supervisor-%s", 
IdUtils.getRandomId()));
     props.put("auto.offset.reset", "none");
     props.put("enable.auto.commit", "false");
     props.put("isolation.level", "read_committed");
diff --git 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
index b2352fe..0eb90f9 100644
--- 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
+++ 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.indexing.common.stats.RowIngestionMetersFactory;
 import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.common.task.TaskResource;
@@ -219,7 +219,7 @@ public class KafkaSupervisor extends 
SeekableStreamSupervisor<Integer, Long>
 
     List<SeekableStreamIndexTask<Integer, Long>> taskList = new ArrayList<>();
     for (int i = 0; i < replicas; i++) {
-      String taskId = TaskIdUtils.getRandomIdWithPrefix(baseSequenceName);
+      String taskId = IdUtils.getRandomIdWithPrefix(baseSequenceName);
       taskList.add(new KafkaIndexTask(
           taskId,
           new TaskResource(baseSequenceName, 1),
diff --git 
a/extensions-core/kinesis-indexing-service/src/main/java/org/apache/druid/indexing/kinesis/supervisor/KinesisSupervisor.java
 
b/extensions-core/kinesis-indexing-service/src/main/java/org/apache/druid/indexing/kinesis/supervisor/KinesisSupervisor.java
index 494e901..8128796 100644
--- 
a/extensions-core/kinesis-indexing-service/src/main/java/org/apache/druid/indexing/kinesis/supervisor/KinesisSupervisor.java
+++ 
b/extensions-core/kinesis-indexing-service/src/main/java/org/apache/druid/indexing/kinesis/supervisor/KinesisSupervisor.java
@@ -24,7 +24,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableMap;
 import org.apache.druid.common.aws.AWSCredentialsConfig;
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.indexing.common.stats.RowIngestionMetersFactory;
 import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.common.task.TaskResource;
@@ -166,7 +166,7 @@ public class KinesisSupervisor extends 
SeekableStreamSupervisor<String, String>
 
     List<SeekableStreamIndexTask<String, String>> taskList = new ArrayList<>();
     for (int i = 0; i < replicas; i++) {
-      String taskId = TaskIdUtils.getRandomIdWithPrefix(baseSequenceName);
+      String taskId = IdUtils.getRandomIdWithPrefix(baseSequenceName);
       taskList.add(new KinesisIndexTask(
           taskId,
           new TaskResource(baseSequenceName, 1),
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AbstractTask.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AbstractTask.java
index 728f3de..dbc9119 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AbstractTask.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AbstractTask.java
@@ -24,7 +24,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.indexer.TaskStatus;
 import org.apache.druid.indexing.common.TaskLock;
 import org.apache.druid.indexing.common.actions.LockListAction;
@@ -92,7 +92,7 @@ public abstract class AbstractTask implements Task
     }
 
     final List<Object> objects = new ArrayList<>();
-    final String suffix = TaskIdUtils.getRandomId();
+    final String suffix = IdUtils.getRandomId();
     objects.add(typeName);
     objects.add(dataSource);
     objects.add(suffix);
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/security/TaskResourceFilter.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/security/TaskResourceFilter.java
index 042c2a2..51b17f8 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/security/TaskResourceFilter.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/security/TaskResourceFilter.java
@@ -25,7 +25,7 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
 import com.sun.jersey.spi.container.ContainerRequest;
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.overlord.TaskStorageQueryAdapter;
 import org.apache.druid.java.util.common.StringUtils;
@@ -82,7 +82,7 @@ public class TaskResourceFilter extends AbstractResourceFilter
                ).getPath()
     );
     taskId = StringUtils.urlDecode(taskId);
-    TaskIdUtils.validateId("taskId", taskId);
+    IdUtils.validateId("taskId", taskId);
 
     Optional<Task> taskOptional = taskStorageQueryAdapter.getTask(taskId);
     if (!taskOptional.isPresent()) {
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/worker/IntermediaryDataManager.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/worker/IntermediaryDataManager.java
index 6df598c..408fba5 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/worker/IntermediaryDataManager.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/worker/IntermediaryDataManager.java
@@ -26,8 +26,8 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.mutable.MutableInt;
 import org.apache.druid.client.indexing.IndexingServiceClient;
 import org.apache.druid.client.indexing.TaskStatus;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.guice.ManageLifecycle;
-import org.apache.druid.indexer.TaskIdUtils;
 import org.apache.druid.indexing.common.config.TaskConfig;
 import org.apache.druid.indexing.worker.config.WorkerConfig;
 import org.apache.druid.java.util.common.DateTimes;
@@ -337,7 +337,7 @@ public class IntermediaryDataManager
   @Nullable
   public File findPartitionFile(String supervisorTaskId, String subTaskId, 
Interval interval, int bucketId)
   {
-    TaskIdUtils.validateId("supervisorTaskId", supervisorTaskId);
+    IdUtils.validateId("supervisorTaskId", supervisorTaskId);
     for (StorageLocation location : shuffleDataLocations) {
       final File partitionDir = new File(location.getPath(), 
getPartitionDir(supervisorTaskId, interval, bucketId));
       if (partitionDir.exists()) {
@@ -366,7 +366,7 @@ public class IntermediaryDataManager
 
   public void deletePartitions(String supervisorTaskId) throws IOException
   {
-    TaskIdUtils.validateId("supervisorTaskId", supervisorTaskId);
+    IdUtils.validateId("supervisorTaskId", supervisorTaskId);
     for (StorageLocation location : shuffleDataLocations) {
       final File supervisorTaskPath = new File(location.getPath(), 
supervisorTaskId);
       if (supervisorTaskPath.exists()) {
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/worker/http/WorkerResource.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/worker/http/WorkerResource.java
index dd108f3..a66a4e7 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/worker/http/WorkerResource.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/worker/http/WorkerResource.java
@@ -27,7 +27,7 @@ import com.google.common.collect.Lists;
 import com.google.common.io.ByteSource;
 import com.google.inject.Inject;
 import com.sun.jersey.spi.container.ResourceFilters;
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.indexing.overlord.TaskRunner;
 import org.apache.druid.indexing.overlord.TaskRunnerWorkItem;
 import org.apache.druid.indexing.worker.Worker;
@@ -189,7 +189,7 @@ public class WorkerResource
       @QueryParam("offset") @DefaultValue("0") long offset
   )
   {
-    TaskIdUtils.validateId("taskId", taskId);
+    IdUtils.validateId("taskId", taskId);
     if (!(taskRunner instanceof TaskLogStreamer)) {
       return Response.status(501)
                      .entity(StringUtils.format(
diff --git 
a/integration-tests/src/main/java/org/apache/druid/testing/utils/KafkaEventWriter.java
 
b/integration-tests/src/main/java/org/apache/druid/testing/utils/KafkaEventWriter.java
index a505285..1d5973c 100644
--- 
a/integration-tests/src/main/java/org/apache/druid/testing/utils/KafkaEventWriter.java
+++ 
b/integration-tests/src/main/java/org/apache/druid/testing/utils/KafkaEventWriter.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.testing.utils;
 
-import org.apache.druid.indexer.TaskIdUtils;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.testing.IntegrationTestingConfig;
 import org.apache.kafka.clients.producer.KafkaProducer;
 import org.apache.kafka.clients.producer.ProducerRecord;
@@ -51,7 +51,7 @@ public class KafkaEventWriter implements StreamEventWriter
     this.txnEnabled = txnEnabled;
     if (txnEnabled) {
       properties.setProperty("enable.idempotence", "true");
-      properties.setProperty("transactional.id", TaskIdUtils.getRandomId());
+      properties.setProperty("transactional.id", IdUtils.getRandomId());
     }
     this.producer = new KafkaProducer<>(
         properties,
diff --git 
a/integration-tests/src/test/java/org/apache/druid/tests/security/ITBasicAuthConfigurationTest.java
 
b/integration-tests/src/test/java/org/apache/druid/tests/security/ITBasicAuthConfigurationTest.java
index 2a8506f..9f127a5 100644
--- 
a/integration-tests/src/test/java/org/apache/druid/tests/security/ITBasicAuthConfigurationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/druid/tests/security/ITBasicAuthConfigurationTest.java
@@ -54,6 +54,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
+import java.nio.charset.StandardCharsets;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
@@ -473,6 +474,52 @@ public class ITBasicAuthConfigurationTest
   }
 
   @Test
+  public void testInvalidAuthNames()
+  {
+    String invalidName = "invalid%2Fname";
+    HttpClient adminClient = new CredentialedHttpClient(
+        new BasicCredentials("admin", "priest"),
+        httpClient
+    );
+
+    HttpUtil.makeRequestWithExpectedStatus(
+        adminClient,
+        HttpMethod.POST,
+        StringUtils.format(
+            "%s/druid-ext/basic-security/authentication/listen/%s",
+            config.getCoordinatorUrl(),
+            invalidName
+        ),
+        "SERIALIZED_DATA".getBytes(StandardCharsets.UTF_8),
+        HttpResponseStatus.INTERNAL_SERVER_ERROR
+    );
+
+    HttpUtil.makeRequestWithExpectedStatus(
+        adminClient,
+        HttpMethod.POST,
+        StringUtils.format(
+            "%s/druid-ext/basic-security/authorization/listen/users/%s",
+            config.getCoordinatorUrl(),
+            invalidName
+        ),
+        "SERIALIZED_DATA".getBytes(StandardCharsets.UTF_8),
+        HttpResponseStatus.INTERNAL_SERVER_ERROR
+    );
+
+    HttpUtil.makeRequestWithExpectedStatus(
+        adminClient,
+        HttpMethod.POST,
+        StringUtils.format(
+            
"%s/druid-ext/basic-security/authorization/listen/groupMappings/%s",
+            config.getCoordinatorUrl(),
+            invalidName
+        ),
+        "SERIALIZED_DATA".getBytes(StandardCharsets.UTF_8),
+        HttpResponseStatus.INTERNAL_SERVER_ERROR
+    );
+  }
+
+  @Test
   public void testMaliciousUser()
   {
     String maliciousUsername = "<script>alert('hello')</script>";
diff --git 
a/server/src/main/java/org/apache/druid/segment/indexing/DataSchema.java 
b/server/src/main/java/org/apache/druid/segment/indexing/DataSchema.java
index 6be9a71..3fc0fa2 100644
--- a/server/src/main/java/org/apache/druid/segment/indexing/DataSchema.java
+++ b/server/src/main/java/org/apache/druid/segment/indexing/DataSchema.java
@@ -28,11 +28,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
+import org.apache.druid.common.utils.IdUtils;
 import org.apache.druid.data.input.impl.DimensionsSpec;
 import org.apache.druid.data.input.impl.InputRowParser;
 import org.apache.druid.data.input.impl.ParseSpec;
 import org.apache.druid.data.input.impl.TimestampSpec;
-import org.apache.druid.indexer.TaskIdUtils;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.query.aggregation.AggregatorFactory;
@@ -147,7 +147,7 @@ public class DataSchema
 
   private static void validateDatasourceName(String dataSource)
   {
-    TaskIdUtils.validateId("dataSource", dataSource);
+    IdUtils.validateId("dataSource", dataSource);
   }
 
   private static DimensionsSpec computeDimensionsSpec(
diff --git 
a/server/src/main/java/org/apache/druid/server/initialization/AuthorizerMapperModule.java
 
b/server/src/main/java/org/apache/druid/server/initialization/AuthorizerMapperModule.java
index c8d9482..f547d14 100644
--- 
a/server/src/main/java/org/apache/druid/server/initialization/AuthorizerMapperModule.java
+++ 
b/server/src/main/java/org/apache/druid/server/initialization/AuthorizerMapperModule.java
@@ -33,9 +33,9 @@ import org.apache.druid.initialization.DruidModule;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
-import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.server.security.AllowAllAuthorizer;
 import org.apache.druid.server.security.AuthConfig;
+import org.apache.druid.server.security.AuthValidator;
 import org.apache.druid.server.security.Authorizer;
 import org.apache.druid.server.security.AuthorizerMapper;
 
@@ -50,7 +50,6 @@ import java.util.Set;
 public class AuthorizerMapperModule implements DruidModule
 {
   private static final String AUTHORIZER_PROPERTIES_FORMAT_STRING = 
"druid.auth.authorizer.%s";
-  private static Logger log = new Logger(AuthorizerMapperModule.class);
 
   @Override
   public void configure(Binder binder)
@@ -58,7 +57,8 @@ public class AuthorizerMapperModule implements DruidModule
     binder.bind(AuthorizerMapper.class)
           .toProvider(new AuthorizerMapperProvider())
           .in(LazySingleton.class);
-
+    binder.bind(AuthValidator.class)
+          .in(LazySingleton.class);
     LifecycleModule.register(binder, AuthorizerMapper.class);
   }
 
@@ -97,7 +97,8 @@ public class AuthorizerMapperModule implements DruidModule
         AllowAllAuthorizer allowAllAuthorizer = new AllowAllAuthorizer();
         authorizerMap.put(AuthConfig.ALLOW_ALL_NAME, allowAllAuthorizer);
 
-        return new AuthorizerMapper(null) {
+        return new AuthorizerMapper(null)
+        {
           @Override
           public Authorizer getAuthorizer(String name)
           {
diff --git 
a/server/src/main/java/org/apache/druid/server/security/AuthValidator.java 
b/server/src/main/java/org/apache/druid/server/security/AuthValidator.java
new file mode 100644
index 0000000..b0ad386
--- /dev/null
+++ b/server/src/main/java/org/apache/druid/server/security/AuthValidator.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server.security;
+
+import org.apache.druid.common.utils.IdUtils;
+
+/**
+ * Utility functions to validate the an authorizer.
+ */
+public class AuthValidator
+{
+  private static final String AUTHORIZER_NAME = "authorizerName";
+  private static final String AUTHENTICATOR_NAME = "authenticatorName";
+
+  /**
+   * Validates the provided authorizerName.
+   *
+   * @param authorizerName the name of the authorizer.
+   * @throws IllegalArgumentException on invalid authorizer names.
+   */
+  public void validateAuthorizerName(String authorizerName)
+  {
+    IdUtils.validateId(AUTHORIZER_NAME, authorizerName);
+  }
+
+  /**
+   * Validates the provided authenticatorName.
+   *
+   * @param authenticatorName the name of the authenticator.
+   * @throws IllegalArgumentException on invalid authenticator names.
+   */
+  public void validateAuthenticatorName(String authenticatorName)
+  {
+    IdUtils.validateId(AUTHENTICATOR_NAME, authenticatorName);
+  }
+}
diff --git 
a/server/src/test/java/org/apache/druid/segment/indexing/DataSchemaTest.java 
b/server/src/test/java/org/apache/druid/segment/indexing/DataSchemaTest.java
index 5f116b4..13bf27d 100644
--- a/server/src/test/java/org/apache/druid/segment/indexing/DataSchemaTest.java
+++ b/server/src/test/java/org/apache/druid/segment/indexing/DataSchemaTest.java
@@ -26,12 +26,12 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import org.apache.commons.text.StringEscapeUtils;
+import org.apache.druid.common.utils.IdUtilsTest;
 import org.apache.druid.data.input.InputRow;
 import org.apache.druid.data.input.impl.DimensionsSpec;
 import org.apache.druid.data.input.impl.JSONParseSpec;
 import org.apache.druid.data.input.impl.StringInputRowParser;
 import org.apache.druid.data.input.impl.TimestampSpec;
-import org.apache.druid.indexer.TaskIdUtilsTest;
 import org.apache.druid.java.util.common.DateTimes;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.Intervals;
@@ -85,7 +85,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     DataSchema schema = new DataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         parser,
         new AggregatorFactory[]{
             new DoubleSumAggregatorFactory("metric1", "col1"),
@@ -123,7 +123,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     DataSchema schema = new DataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         parser,
         new AggregatorFactory[]{
             new DoubleSumAggregatorFactory("metric1", "col1"),
@@ -161,7 +161,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     DataSchema schema = new DataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         parserMap,
         new AggregatorFactory[]{
             new DoubleSumAggregatorFactory("metric1", "col1"),
@@ -220,7 +220,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     DataSchema schema = new DataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         parser,
         new AggregatorFactory[]{
             new DoubleSumAggregatorFactory("metric1", "col1"),
@@ -254,7 +254,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     DataSchema schema = new DataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         parser,
         new AggregatorFactory[]{
             new DoubleSumAggregatorFactory("metric1", "col1"),
@@ -272,7 +272,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
   public void testSerdeWithInvalidParserMap() throws Exception
   {
     String jsonStr = "{"
-                     + "\"dataSource\":\"" + 
StringEscapeUtils.escapeJson(TaskIdUtilsTest.VALID_ID_CHARS) + "\","
+                     + "\"dataSource\":\"" + 
StringEscapeUtils.escapeJson(IdUtilsTest.VALID_ID_CHARS) + "\","
                      + "\"parser\":{\"type\":\"invalid\"},"
                      + 
"\"metricsSpec\":[{\"type\":\"doubleSum\",\"name\":\"metric1\",\"fieldName\":\"col1\"}],"
                      + "\"granularitySpec\":{"
@@ -376,7 +376,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
   public void testSerde() throws Exception
   {
     String jsonStr = "{"
-                     + "\"dataSource\":\"" + 
StringEscapeUtils.escapeJson(TaskIdUtilsTest.VALID_ID_CHARS) + "\","
+                     + "\"dataSource\":\"" + 
StringEscapeUtils.escapeJson(IdUtilsTest.VALID_ID_CHARS) + "\","
                      + "\"parser\":{"
                      + "\"type\":\"string\","
                      + "\"parseSpec\":{"
@@ -400,7 +400,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
         DataSchema.class
     );
 
-    Assert.assertEquals(actual.getDataSource(), 
TaskIdUtilsTest.VALID_ID_CHARS);
+    Assert.assertEquals(actual.getDataSource(), IdUtilsTest.VALID_ID_CHARS);
     Assert.assertEquals(
         actual.getParser().getParseSpec(),
         new JSONParseSpec(
@@ -482,7 +482,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     DataSchema originalSchema = new DataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         parser,
         new AggregatorFactory[]{
             new DoubleSumAggregatorFactory("metric1", "col1"),
@@ -522,7 +522,7 @@ public class DataSchemaTest extends 
InitializedNullHandlingTest
     );
 
     TestModifiedDataSchema originalSchema = new TestModifiedDataSchema(
-        TaskIdUtilsTest.VALID_ID_CHARS,
+        IdUtilsTest.VALID_ID_CHARS,
         null,
         null,
         new AggregatorFactory[]{
diff --git 
a/server/src/test/java/org/apache/druid/server/initialization/AuthorizerMapperModuleTest.java
 
b/server/src/test/java/org/apache/druid/server/initialization/AuthorizerMapperModuleTest.java
new file mode 100644
index 0000000..5bc2231
--- /dev/null
+++ 
b/server/src/test/java/org/apache/druid/server/initialization/AuthorizerMapperModuleTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server.initialization;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Scopes;
+import org.apache.druid.guice.LazySingleton;
+import org.apache.druid.server.security.AuthValidator;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+public class AuthorizerMapperModuleTest
+{
+  private AuthorizerMapperModule target;
+  private Injector injector;
+
+  @Before
+  public void setUp()
+  {
+    target = new AuthorizerMapperModule();
+    injector = Guice.createInjector(
+        (binder) -> {
+          
binder.bind(Validator.class).toInstance(Validation.buildDefaultValidatorFactory().getValidator());
+          binder.bindScope(LazySingleton.class, Scopes.SINGLETON);
+        },
+        target
+    );
+  }
+
+  @Test
+  public void testAuthorizerNameValidatorIsInjectedAsSingleton()
+  {
+    AuthValidator authValidator =
+        injector.getInstance(AuthValidator.class);
+    AuthValidator other =
+        injector.getInstance(AuthValidator.class);
+    Assert.assertSame(authValidator, other);
+  }
+}
diff --git 
a/server/src/test/java/org/apache/druid/server/security/AuthValidatorTest.java 
b/server/src/test/java/org/apache/druid/server/security/AuthValidatorTest.java
new file mode 100644
index 0000000..3edfec1
--- /dev/null
+++ 
b/server/src/test/java/org/apache/druid/server/security/AuthValidatorTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server.security;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class AuthValidatorTest
+{
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  public AuthValidator target;
+
+  @Before
+  public void setUp()
+  {
+    target = new AuthValidator();
+  }
+
+  @Test
+  public void testAuthorizerNameWithEmptyIsInvalid()
+  {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("authorizerName cannot be null or empty.");
+    target.validateAuthorizerName("");
+  }
+
+  @Test
+  public void testAuthorizerNameWithNullIsInvalid()
+  {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("authorizerName cannot be null or empty.");
+    target.validateAuthorizerName(null);
+  }
+
+  @Test
+  public void testAuthorizerNameStartsWithDotIsInValid()
+  {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("authorizerName cannot start with the '.' 
character.");
+    target.validateAuthorizerName(".test");
+  }
+
+  @Test
+  public void testAuthorizerNameWithSlashIsInvalid()
+  {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("authorizerName cannot contain the '/' 
character.");
+    target.validateAuthorizerName("tes/t");
+  }
+
+  @Test
+  public void testAuthorizerNameWithWhitespaceIsInvalid()
+  {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("authorizerName cannot contain whitespace 
character except space.");
+    target.validateAuthorizerName("tes\tt");
+  }
+
+  @Test
+  public void testAuthorizerNameWithAllowedCharactersIsValid()
+  {
+    target.validateAuthorizerName("t.e.$\\, Россия 한국中国!?");
+  }
+
+  @Test
+  public void testAuthenticatorNameWithAllowedCharactersIsValid()
+  {
+    target.validateAuthenticatorName("t.e.$\\, Россия 한국中国!?");
+  }
+
+  @Test
+  public void testAuthenticatorNameWithWhitespaceIsInvalid()
+  {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("authenticatorName cannot contain 
whitespace character except space.");
+    target.validateAuthenticatorName("tes\tt");
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to