diff --git a/README.adoc b/README.adoc
index d4b1f5c..a2839fc 100644
--- a/README.adoc
+++ b/README.adoc
@@ -39,6 +39,7 @@
 |geronimo.jwt-auth.jwt.header.alg.default|The default `alg` if specified|RS256
 |geronimo.jwt-auth.jwt.header.typ.default|The default `typ` if specified|JWT
 |geronimo.jwt-auth.jwt.header.typ.validate|Should the typ value be validated (only `JWT` is supported)|true
+|geronimo.jwt-auth.filter.active|If `true` it forces the filter to be added whatever config (`@LoginConfig` is used or not)|false
 |geronimo.jwt-auth.filter.mapping.default|When the JAX-RS `Application` doesn't have an `@ApplicationPath` and no servlet registration are found for the application this defines the path to use to handle JWT|/*
 |geronimo.jwt-auth.filter.publicUrls|List of URL to ignore|-
 |geronimo.jwt-auth.kids.key.mapping|The mapping between the kid and the public key to use|-
diff --git a/geronimo-jwt-auth-impl/src/main/java/org/apache/geronimo/microprofile/impl/jwtauth/servlet/GeronimoJwtAuthInitializer.java b/geronimo-jwt-auth-impl/src/main/java/org/apache/geronimo/microprofile/impl/jwtauth/servlet/GeronimoJwtAuthInitializer.java
index 023ddcb..43f85be 100644
--- a/geronimo-jwt-auth-impl/src/main/java/org/apache/geronimo/microprofile/impl/jwtauth/servlet/GeronimoJwtAuthInitializer.java
+++ b/geronimo-jwt-auth-impl/src/main/java/org/apache/geronimo/microprofile/impl/jwtauth/servlet/GeronimoJwtAuthInitializer.java
@@ -21,6 +21,7 @@
 import java.util.Comparator;
 import java.util.EnumSet;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import javax.servlet.DispatcherType;
 import javax.servlet.FilterRegistration;
@@ -39,12 +40,23 @@
 public class GeronimoJwtAuthInitializer implements ServletContainerInitializer {
     @Override
     public void onStartup(final Set<Class<?>> classes, final ServletContext ctx) throws ServletException {
-        ofNullable(classes).filter(c -> !c.isEmpty()).ifPresent(marked -> marked.stream()
-                .filter(Application.class::isAssignableFrom) // needed? what's the issue dropping it? nothing normally
-                .filter(app -> app.isAnnotationPresent(LoginConfig.class))
-                .filter(it -> "MP-JWT".equalsIgnoreCase(it.getAnnotation(LoginConfig.class).authMethod()))
-                .sorted(Comparator.comparing(Class::getName)) // to be deterministic
-                .findFirst()
+        final Supplier<GeronimoJwtAuthConfig> config = new Supplier<GeronimoJwtAuthConfig>() {
+            private GeronimoJwtAuthConfig config;
+
+            @Override
+            public GeronimoJwtAuthConfig get() {
+                return config == null ? config = GeronimoJwtAuthConfig.create() : config;
+            }
+        };
+        ofNullable(classes).filter(c -> !c.isEmpty()).ifPresent(marked -> // needed? what's the issue dropping it?
+                // nothing normally
+                // to be deterministic
+                marked.stream()
+                      .filter(Application.class::isAssignableFrom) // needed? what's the issue dropping it? nothing
+                      // normally
+                      .filter(app -> "true".equalsIgnoreCase(config.get().read("filter.active", "false")) ||
+                              (app.isAnnotationPresent(LoginConfig.class) && "MP-JWT".equalsIgnoreCase(app.getAnnotation(LoginConfig.class).authMethod())))
+                      .min(Comparator.comparing(Class::getName))
                 .ifPresent(app -> {
                     final FilterRegistration.Dynamic filter = ctx.addFilter("geronimo-microprofile-jwt-auth-filter", GeronimoJwtAuthFilter.class);
                     filter.setAsyncSupported(true);
@@ -70,7 +82,7 @@
                                 }
 
                                 // unlikely
-                                return new String[]{GeronimoJwtAuthConfig.create().read("filter.mapping.default", "/*")};
+                                return new String[]{config.get().read("filter.mapping.default", "/*")};
                             });
                     filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, mappings);
                 }));
