|
@@ -27,6 +27,7 @@ import java.net.InetSocketAddress;
|
|
import java.net.MalformedURLException;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URI;
|
|
import java.net.URI;
|
|
import java.net.URL;
|
|
import java.net.URL;
|
|
|
|
+import java.util.Arrays;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
import java.util.Enumeration;
|
|
import java.util.Enumeration;
|
|
@@ -66,6 +67,8 @@ import org.apache.hadoop.security.AuthenticationFilterInitializer;
|
|
import org.apache.hadoop.security.SecurityUtil;
|
|
import org.apache.hadoop.security.SecurityUtil;
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.security.authentication.server.AuthenticationFilter;
|
|
import org.apache.hadoop.security.authentication.server.AuthenticationFilter;
|
|
|
|
+import org.apache.hadoop.security.authentication.server.ProxyUserAuthenticationFilterInitializer;
|
|
|
|
+import org.apache.hadoop.security.authentication.server.PseudoAuthenticationHandler;
|
|
import org.apache.hadoop.security.authentication.util.SignerSecretProvider;
|
|
import org.apache.hadoop.security.authentication.util.SignerSecretProvider;
|
|
import org.apache.hadoop.security.authorize.AccessControlList;
|
|
import org.apache.hadoop.security.authorize.AccessControlList;
|
|
import org.apache.hadoop.security.ssl.SSLFactory;
|
|
import org.apache.hadoop.security.ssl.SSLFactory;
|
|
@@ -90,7 +93,6 @@ import org.eclipse.jetty.server.handler.HandlerCollection;
|
|
import org.eclipse.jetty.server.handler.RequestLogHandler;
|
|
import org.eclipse.jetty.server.handler.RequestLogHandler;
|
|
import org.eclipse.jetty.server.session.AbstractSessionManager;
|
|
import org.eclipse.jetty.server.session.AbstractSessionManager;
|
|
import org.eclipse.jetty.server.session.SessionHandler;
|
|
import org.eclipse.jetty.server.session.SessionHandler;
|
|
-import org.eclipse.jetty.servlet.DefaultServlet;
|
|
|
|
import org.eclipse.jetty.servlet.FilterHolder;
|
|
import org.eclipse.jetty.servlet.FilterHolder;
|
|
import org.eclipse.jetty.servlet.FilterMapping;
|
|
import org.eclipse.jetty.servlet.FilterMapping;
|
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
|
@@ -155,7 +157,7 @@ public final class HttpServer2 implements FilterContainer {
|
|
// gets stored.
|
|
// gets stored.
|
|
public static final String CONF_CONTEXT_ATTRIBUTE = "hadoop.conf";
|
|
public static final String CONF_CONTEXT_ATTRIBUTE = "hadoop.conf";
|
|
public static final String ADMINS_ACL = "admins.acl";
|
|
public static final String ADMINS_ACL = "admins.acl";
|
|
- public static final String SPNEGO_FILTER = "SpnegoFilter";
|
|
|
|
|
|
+ public static final String SPNEGO_FILTER = "authentication";
|
|
public static final String NO_CACHE_FILTER = "NoCacheFilter";
|
|
public static final String NO_CACHE_FILTER = "NoCacheFilter";
|
|
|
|
|
|
public static final String BIND_ADDRESS = "bind.address";
|
|
public static final String BIND_ADDRESS = "bind.address";
|
|
@@ -433,7 +435,9 @@ public final class HttpServer2 implements FilterContainer {
|
|
|
|
|
|
HttpServer2 server = new HttpServer2(this);
|
|
HttpServer2 server = new HttpServer2(this);
|
|
|
|
|
|
- if (this.securityEnabled) {
|
|
|
|
|
|
+ if (this.securityEnabled &&
|
|
|
|
+ !this.conf.get(authFilterConfigurationPrefix + "type").
|
|
|
|
+ equals(PseudoAuthenticationHandler.TYPE)) {
|
|
server.initSpnego(conf, hostName, usernameConfKey, keytabConfKey);
|
|
server.initSpnego(conf, hostName, usernameConfKey, keytabConfKey);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -608,13 +612,6 @@ public final class HttpServer2 implements FilterContainer {
|
|
}
|
|
}
|
|
|
|
|
|
addDefaultServlets();
|
|
addDefaultServlets();
|
|
-
|
|
|
|
- if (pathSpecs != null) {
|
|
|
|
- for (String path : pathSpecs) {
|
|
|
|
- LOG.info("adding path spec: " + path);
|
|
|
|
- addFilterPathMapping(path, webAppContext);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
private void addListener(ServerConnector connector) {
|
|
private void addListener(ServerConnector connector) {
|
|
@@ -625,7 +622,7 @@ public final class HttpServer2 implements FilterContainer {
|
|
AccessControlList adminsAcl, final String appDir) {
|
|
AccessControlList adminsAcl, final String appDir) {
|
|
WebAppContext ctx = new WebAppContext();
|
|
WebAppContext ctx = new WebAppContext();
|
|
ctx.setDefaultsDescriptor(null);
|
|
ctx.setDefaultsDescriptor(null);
|
|
- ServletHolder holder = new ServletHolder(new DefaultServlet());
|
|
|
|
|
|
+ ServletHolder holder = new ServletHolder(new WebServlet());
|
|
Map<String, String> params = ImmutableMap. <String, String> builder()
|
|
Map<String, String> params = ImmutableMap. <String, String> builder()
|
|
.put("acceptRanges", "true")
|
|
.put("acceptRanges", "true")
|
|
.put("dirAllowed", "false")
|
|
.put("dirAllowed", "false")
|
|
@@ -684,10 +681,16 @@ public final class HttpServer2 implements FilterContainer {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
- FilterInitializer[] initializers = new FilterInitializer[classes.length];
|
|
|
|
- for(int i = 0; i < classes.length; i++) {
|
|
|
|
|
|
+ List<Class<?>> classList = new ArrayList<>(Arrays.asList(classes));
|
|
|
|
+ if (classList.contains(AuthenticationFilterInitializer.class) &&
|
|
|
|
+ classList.contains(ProxyUserAuthenticationFilterInitializer.class)) {
|
|
|
|
+ classList.remove(AuthenticationFilterInitializer.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FilterInitializer[] initializers = new FilterInitializer[classList.size()];
|
|
|
|
+ for(int i = 0; i < classList.size(); i++) {
|
|
initializers[i] = (FilterInitializer)ReflectionUtils.newInstance(
|
|
initializers[i] = (FilterInitializer)ReflectionUtils.newInstance(
|
|
- classes[i], conf);
|
|
|
|
|
|
+ classList.get(i), conf);
|
|
}
|
|
}
|
|
return initializers;
|
|
return initializers;
|
|
}
|
|
}
|
|
@@ -735,7 +738,7 @@ public final class HttpServer2 implements FilterContainer {
|
|
ServletContextHandler staticContext =
|
|
ServletContextHandler staticContext =
|
|
new ServletContextHandler(parent, "/static");
|
|
new ServletContextHandler(parent, "/static");
|
|
staticContext.setResourceBase(appDir + "/static");
|
|
staticContext.setResourceBase(appDir + "/static");
|
|
- staticContext.addServlet(DefaultServlet.class, "/*");
|
|
|
|
|
|
+ staticContext.addServlet(WebServlet.class, "/*");
|
|
staticContext.setDisplayName("static");
|
|
staticContext.setDisplayName("static");
|
|
@SuppressWarnings("unchecked")
|
|
@SuppressWarnings("unchecked")
|
|
Map<String, String> params = staticContext.getInitParams();
|
|
Map<String, String> params = staticContext.getInitParams();
|
|
@@ -812,7 +815,6 @@ public final class HttpServer2 implements FilterContainer {
|
|
public void addServlet(String name, String pathSpec,
|
|
public void addServlet(String name, String pathSpec,
|
|
Class<? extends HttpServlet> clazz) {
|
|
Class<? extends HttpServlet> clazz) {
|
|
addInternalServlet(name, pathSpec, clazz, false);
|
|
addInternalServlet(name, pathSpec, clazz, false);
|
|
- addFilterPathMapping(pathSpec, webAppContext);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -869,16 +871,6 @@ public final class HttpServer2 implements FilterContainer {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
webAppContext.addServlet(holder, pathSpec);
|
|
webAppContext.addServlet(holder, pathSpec);
|
|
-
|
|
|
|
- if(requireAuth && UserGroupInformation.isSecurityEnabled()) {
|
|
|
|
- LOG.info("Adding Kerberos (SPNEGO) filter to " + name);
|
|
|
|
- ServletHandler handler = webAppContext.getServletHandler();
|
|
|
|
- FilterMapping fmap = new FilterMapping();
|
|
|
|
- fmap.setPathSpec(pathSpec);
|
|
|
|
- fmap.setFilterName(SPNEGO_FILTER);
|
|
|
|
- fmap.setDispatches(FilterMapping.ALL);
|
|
|
|
- handler.addFilterMapping(fmap);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -945,8 +937,8 @@ public final class HttpServer2 implements FilterContainer {
|
|
Map<String, String> parameters) {
|
|
Map<String, String> parameters) {
|
|
|
|
|
|
FilterHolder filterHolder = getFilterHolder(name, classname, parameters);
|
|
FilterHolder filterHolder = getFilterHolder(name, classname, parameters);
|
|
- final String[] USER_FACING_URLS = { "*.html", "*.jsp" };
|
|
|
|
- FilterMapping fmap = getFilterMapping(name, USER_FACING_URLS);
|
|
|
|
|
|
+ final String[] userFacingUrls = {"/", "/*" };
|
|
|
|
+ FilterMapping fmap = getFilterMapping(name, userFacingUrls);
|
|
defineFilter(webAppContext, filterHolder, fmap);
|
|
defineFilter(webAppContext, filterHolder, fmap);
|
|
LOG.info(
|
|
LOG.info(
|
|
"Added filter " + name + " (class=" + classname + ") to context "
|
|
"Added filter " + name + " (class=" + classname + ") to context "
|