Add a test for required ids
diff --git a/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java b/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
index ac53394..20d6073 100644
--- a/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
+++ b/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
@@ -184,7 +184,7 @@
         executorService.shutdown();
     }
 
-    private void restartAllActiveServiceUserMappedServices() {
+    void restartAllActiveServiceUserMappedServices() {
         RegistrationSet registrationSet = new RegistrationSet();
         registrationSet.removed = activeRegistrations.values();
         registrationSet.added = activeRegistrations.values();
@@ -482,7 +482,7 @@
         return this.defaultUser;
     }
 
-    private boolean isValidUser(final String userId, final String serviceName, final String subServiceName, boolean require) {
+    boolean isValidUser(final String userId, final String serviceName, final String subServiceName, boolean require) {
         if (userId == null) {
             log.debug("isValidUser: userId is null -> invalid");
             return false;
@@ -508,7 +508,7 @@
         }
     }
 
-    private boolean areValidPrincipals(final Iterable<String> principalNames, final String serviceName, final String subServiceName, boolean require) {
+    boolean areValidPrincipals(final Iterable<String> principalNames, final String serviceName, final String subServiceName, boolean require) {
         if (principalNames == null) {
             log.debug("areValidPrincipals: principalNames are null -> invalid");
             return false;
diff --git a/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java b/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
index 98a556a..a392b41 100644
--- a/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
+++ b/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
@@ -20,7 +20,7 @@
 
 import static junit.framework.TestCase.assertFalse;
 import static junit.framework.TestCase.assertNull;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -31,7 +31,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
@@ -39,6 +38,7 @@
 import java.util.stream.StreamSupport;
 
 import org.apache.sling.serviceusermapping.ServicePrincipalsValidator;
+import org.apache.sling.serviceusermapping.ServiceUserMapper;
 import org.apache.sling.serviceusermapping.ServiceUserValidator;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -102,6 +102,62 @@
     }
 
     @Test
+    public void test_requiredValidators() {
+        ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class);
+        when(config.require_validation()).thenReturn(true);
+        when(config.required_validators()).thenReturn(new String[] {"bla","bli","blub"});
+
+        final ServiceUserMapperImpl mapper = new ServiceUserMapperImpl(null, config) {
+            @Override
+            void restartAllActiveServiceUserMappedServices() {
+                throw new IllegalStateException();
+            }
+        };
+        ServiceUserValidator userValidator = mock(ServiceUserValidator.class);
+        ServicePrincipalsValidator principalsValidator1 = mock(ServicePrincipalsValidator.class);
+        ServicePrincipalsValidator principalsValidator2 = mock(ServicePrincipalsValidator.class);
+
+        assertTrue(mapper.isValidUser("org", "foo", "bar", false));
+        assertFalse(mapper.isValidUser("org", "foo", "bar", true));
+
+        assertTrue(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", false));
+        assertFalse(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", true));
+
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(ServiceUserMapper.VALIDATOR_ID, "bla");
+        mapper.bindServiceUserValidator(userValidator, properties);
+
+        assertTrue(mapper.isValidUser("org", "foo", "bar", false));
+        assertFalse(mapper.isValidUser("org", "foo", "bar", true));
+
+        assertTrue(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", false));
+        assertFalse(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", true));
+
+        properties.put(ServiceUserMapper.VALIDATOR_ID, "bli");
+        mapper.bindServicePrincipalsValidator(principalsValidator2, properties);
+
+        assertTrue(mapper.isValidUser("org", "foo", "bar", false));
+        assertFalse(mapper.isValidUser("org", "foo", "bar", true));
+
+        assertTrue(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", false));
+        assertFalse(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", true));
+
+        properties.put(ServiceUserMapper.VALIDATOR_ID, "blub");
+        try {
+            mapper.bindServicePrincipalsValidator(principalsValidator1, properties);
+            fail();
+        } catch (IllegalStateException e) {
+            // Expected;
+        }
+
+        assertFalse(mapper.isValidUser("org", "foo", "bar", false));
+        assertFalse(mapper.isValidUser("org", "foo", "bar", true));
+
+        assertFalse(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", false));
+        assertFalse(mapper.areValidPrincipals(Arrays.asList("baz"), "org", "foo", true));
+    }
+
+    @Test
     public void test_getServiceUserID() {
         ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class);
         when(config.user_mapping()).thenReturn(new String[] {