|
@@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory;
|
|
|
import javax.servlet.Filter;
|
|
|
import javax.servlet.FilterChain;
|
|
|
import javax.servlet.FilterConfig;
|
|
|
+import javax.servlet.ServletContext;
|
|
|
import javax.servlet.ServletException;
|
|
|
import javax.servlet.ServletRequest;
|
|
|
import javax.servlet.ServletResponse;
|
|
@@ -183,8 +184,6 @@ public class AuthenticationFilter implements Filter {
|
|
|
private Signer signer;
|
|
|
private SignerSecretProvider secretProvider;
|
|
|
private AuthenticationHandler authHandler;
|
|
|
- private boolean randomSecret;
|
|
|
- private boolean customSecretProvider;
|
|
|
private long validity;
|
|
|
private String cookieDomain;
|
|
|
private String cookiePath;
|
|
@@ -226,7 +225,6 @@ public class AuthenticationFilter implements Filter {
|
|
|
|
|
|
initializeAuthHandler(authHandlerClassName, filterConfig);
|
|
|
|
|
|
-
|
|
|
cookieDomain = config.getProperty(COOKIE_DOMAIN, null);
|
|
|
cookiePath = config.getProperty(COOKIE_PATH, null);
|
|
|
}
|
|
@@ -237,11 +235,8 @@ public class AuthenticationFilter implements Filter {
|
|
|
Class<?> klass = Thread.currentThread().getContextClassLoader().loadClass(authHandlerClassName);
|
|
|
authHandler = (AuthenticationHandler) klass.newInstance();
|
|
|
authHandler.init(config);
|
|
|
- } catch (ClassNotFoundException ex) {
|
|
|
- throw new ServletException(ex);
|
|
|
- } catch (InstantiationException ex) {
|
|
|
- throw new ServletException(ex);
|
|
|
- } catch (IllegalAccessException ex) {
|
|
|
+ } catch (ClassNotFoundException | InstantiationException |
|
|
|
+ IllegalAccessException ex) {
|
|
|
throw new ServletException(ex);
|
|
|
}
|
|
|
}
|
|
@@ -251,62 +246,59 @@ public class AuthenticationFilter implements Filter {
|
|
|
secretProvider = (SignerSecretProvider) filterConfig.getServletContext().
|
|
|
getAttribute(SIGNER_SECRET_PROVIDER_ATTRIBUTE);
|
|
|
if (secretProvider == null) {
|
|
|
- Class<? extends SignerSecretProvider> providerClass
|
|
|
- = getProviderClass(config);
|
|
|
- try {
|
|
|
- secretProvider = providerClass.newInstance();
|
|
|
- } catch (InstantiationException ex) {
|
|
|
- throw new ServletException(ex);
|
|
|
- } catch (IllegalAccessException ex) {
|
|
|
- throw new ServletException(ex);
|
|
|
- }
|
|
|
+ // As tomcat cannot specify the provider object in the configuration.
|
|
|
+ // It'll go into this path
|
|
|
try {
|
|
|
- secretProvider.init(config, filterConfig.getServletContext(), validity);
|
|
|
+ secretProvider = constructSecretProvider(
|
|
|
+ filterConfig.getServletContext(),
|
|
|
+ config, false);
|
|
|
} catch (Exception ex) {
|
|
|
throw new ServletException(ex);
|
|
|
}
|
|
|
- } else {
|
|
|
- customSecretProvider = true;
|
|
|
}
|
|
|
signer = new Signer(secretProvider);
|
|
|
}
|
|
|
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- private Class<? extends SignerSecretProvider> getProviderClass(Properties config)
|
|
|
- throws ServletException {
|
|
|
- String providerClassName;
|
|
|
- String signerSecretProviderName
|
|
|
- = config.getProperty(SIGNER_SECRET_PROVIDER, null);
|
|
|
- // fallback to old behavior
|
|
|
- if (signerSecretProviderName == null) {
|
|
|
- String signatureSecretFile = config.getProperty(
|
|
|
- SIGNATURE_SECRET_FILE, null);
|
|
|
- // The precedence from high to low : file, random
|
|
|
- if (signatureSecretFile != null) {
|
|
|
- providerClassName = FileSignerSecretProvider.class.getName();
|
|
|
- } else {
|
|
|
- providerClassName = RandomSignerSecretProvider.class.getName();
|
|
|
- randomSecret = true;
|
|
|
+ public static SignerSecretProvider constructSecretProvider(
|
|
|
+ ServletContext ctx, Properties config,
|
|
|
+ boolean disallowFallbackToRandomSecretProvider) throws Exception {
|
|
|
+ String name = config.getProperty(SIGNER_SECRET_PROVIDER, "file");
|
|
|
+ long validity = Long.parseLong(config.getProperty(AUTH_TOKEN_VALIDITY,
|
|
|
+ "36000")) * 1000;
|
|
|
+
|
|
|
+ if (!disallowFallbackToRandomSecretProvider
|
|
|
+ && "file".equals(name)
|
|
|
+ && config.getProperty(SIGNATURE_SECRET_FILE) == null) {
|
|
|
+ name = "random";
|
|
|
+ }
|
|
|
+
|
|
|
+ SignerSecretProvider provider;
|
|
|
+ if ("file".equals(name)) {
|
|
|
+ provider = new FileSignerSecretProvider();
|
|
|
+ try {
|
|
|
+ provider.init(config, ctx, validity);
|
|
|
+ } catch (Exception e) {
|
|
|
+ if (!disallowFallbackToRandomSecretProvider) {
|
|
|
+ LOG.info("Unable to initialize FileSignerSecretProvider, " +
|
|
|
+ "falling back to use random secrets.");
|
|
|
+ provider = new RandomSignerSecretProvider();
|
|
|
+ provider.init(config, ctx, validity);
|
|
|
+ } else {
|
|
|
+ throw e;
|
|
|
+ }
|
|
|
}
|
|
|
+ } else if ("random".equals(name)) {
|
|
|
+ provider = new RandomSignerSecretProvider();
|
|
|
+ provider.init(config, ctx, validity);
|
|
|
+ } else if ("zookeeper".equals(name)) {
|
|
|
+ provider = new ZKSignerSecretProvider();
|
|
|
+ provider.init(config, ctx, validity);
|
|
|
} else {
|
|
|
- if ("random".equals(signerSecretProviderName)) {
|
|
|
- providerClassName = RandomSignerSecretProvider.class.getName();
|
|
|
- randomSecret = true;
|
|
|
- } else if ("file".equals(signerSecretProviderName)) {
|
|
|
- providerClassName = FileSignerSecretProvider.class.getName();
|
|
|
- } else if ("zookeeper".equals(signerSecretProviderName)) {
|
|
|
- providerClassName = ZKSignerSecretProvider.class.getName();
|
|
|
- } else {
|
|
|
- providerClassName = signerSecretProviderName;
|
|
|
- customSecretProvider = true;
|
|
|
- }
|
|
|
- }
|
|
|
- try {
|
|
|
- return (Class<? extends SignerSecretProvider>) Thread.currentThread().
|
|
|
- getContextClassLoader().loadClass(providerClassName);
|
|
|
- } catch (ClassNotFoundException ex) {
|
|
|
- throw new ServletException(ex);
|
|
|
+ provider = (SignerSecretProvider) Thread.currentThread().
|
|
|
+ getContextClassLoader().loadClass(name).newInstance();
|
|
|
+ provider.init(config, ctx, validity);
|
|
|
}
|
|
|
+ return provider;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -335,7 +327,7 @@ public class AuthenticationFilter implements Filter {
|
|
|
* @return if a random secret is being used.
|
|
|
*/
|
|
|
protected boolean isRandomSecret() {
|
|
|
- return randomSecret;
|
|
|
+ return secretProvider.getClass() == RandomSignerSecretProvider.class;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -344,7 +336,10 @@ public class AuthenticationFilter implements Filter {
|
|
|
* @return if a custom implementation of a SignerSecretProvider is being used.
|
|
|
*/
|
|
|
protected boolean isCustomSignerSecretProvider() {
|
|
|
- return customSecretProvider;
|
|
|
+ Class<?> clazz = secretProvider.getClass();
|
|
|
+ return clazz != FileSignerSecretProvider.class && clazz !=
|
|
|
+ RandomSignerSecretProvider.class && clazz != ZKSignerSecretProvider
|
|
|
+ .class;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -385,9 +380,6 @@ public class AuthenticationFilter implements Filter {
|
|
|
authHandler.destroy();
|
|
|
authHandler = null;
|
|
|
}
|
|
|
- if (secretProvider != null) {
|
|
|
- secretProvider.destroy();
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|