Commit d7a139e1 by nixonrodrigues Committed by Madhan Neethiraj

ATLAS-1767: Support KNOX SSO Token based authentication on Atlas REST API calls

parent a0bb4638
...@@ -28,6 +28,7 @@ import com.nimbusds.jose.crypto.RSASSAVerifier; ...@@ -28,6 +28,7 @@ import com.nimbusds.jose.crypto.RSASSAVerifier;
import com.nimbusds.jwt.SignedJWT; import com.nimbusds.jwt.SignedJWT;
import org.apache.atlas.ApplicationProperties; import org.apache.atlas.ApplicationProperties;
import org.apache.atlas.web.security.AtlasAuthenticationProvider; import org.apache.atlas.web.security.AtlasAuthenticationProvider;
import org.apache.atlas.web.util.Servlets;
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
...@@ -57,6 +58,7 @@ import java.security.interfaces.RSAPublicKey; ...@@ -57,6 +58,7 @@ import java.security.interfaces.RSAPublicKey;
import java.text.ParseException; import java.text.ParseException;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import org.apache.commons.lang.StringUtils;
public class AtlasKnoxSSOAuthenticationFilter implements Filter { public class AtlasKnoxSSOAuthenticationFilter implements Filter {
...@@ -69,6 +71,7 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter { ...@@ -69,6 +71,7 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter {
public static final String JWT_ORIGINAL_URL_QUERY_PARAM = "atlas.sso.knox.query.param.originalurl"; public static final String JWT_ORIGINAL_URL_QUERY_PARAM = "atlas.sso.knox.query.param.originalurl";
public static final String JWT_COOKIE_NAME_DEFAULT = "hadoop-jwt"; public static final String JWT_COOKIE_NAME_DEFAULT = "hadoop-jwt";
public static final String JWT_ORIGINAL_URL_QUERY_PARAM_DEFAULT = "originalUrl"; public static final String JWT_ORIGINAL_URL_QUERY_PARAM_DEFAULT = "originalUrl";
public static final String DEFAULT_BROWSER_USERAGENT = "Mozilla,Opera,Chrome";
private SSOAuthenticationProperties jwtProperties; private SSOAuthenticationProperties jwtProperties;
...@@ -134,7 +137,7 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter { ...@@ -134,7 +137,7 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter {
return; return;
} }
if (!isWebUserAgent(httpRequest.getHeader("User-Agent")) || jwtProperties == null || isAuthenticated()) { if (jwtProperties == null || isAuthenticated()) {
filterChain.doFilter(servletRequest, servletResponse); filterChain.doFilter(servletRequest, servletResponse);
return; return;
} }
...@@ -171,18 +174,24 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter { ...@@ -171,18 +174,24 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter {
filterChain.doFilter(servletRequest, httpServletResponse); filterChain.doFilter(servletRequest, httpServletResponse);
} else { // if the token is not valid then redirect to knox sso } else { // if the token is not valid then redirect to knox sso
redirectToKnox(httpRequest,httpServletResponse); redirectToKnox(httpRequest, httpServletResponse, filterChain);
} }
} catch (ParseException e) { } catch (ParseException e) {
LOG.warn("Unable to parse the JWT token", e); LOG.warn("Unable to parse the JWT token", e);
redirectToKnox(httpRequest, httpServletResponse, filterChain);
} }
} else { } else {
redirectToKnox(httpRequest,httpServletResponse); redirectToKnox(httpRequest, httpServletResponse, filterChain);
} }
} }
private void redirectToKnox(HttpServletRequest httpRequest, HttpServletResponse httpServletResponse) throws IOException { private void redirectToKnox(HttpServletRequest httpRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws IOException, ServletException {
if (!isWebUserAgent(httpRequest.getHeader("User-Agent"))) {
filterChain.doFilter(httpRequest, httpServletResponse);
return;
}
String ajaxRequestHeader = httpRequest.getHeader("X-Requested-With"); String ajaxRequestHeader = httpRequest.getHeader("X-Requested-With");
...@@ -403,9 +412,11 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter { ...@@ -403,9 +412,11 @@ public class AtlasKnoxSSOAuthenticationFilter implements Filter {
jwtProperties.setAuthenticationProviderUrl(providerUrl); jwtProperties.setAuthenticationProviderUrl(providerUrl);
jwtProperties.setCookieName(configuration.getString(JWT_COOKIE_NAME, JWT_COOKIE_NAME_DEFAULT)); jwtProperties.setCookieName(configuration.getString(JWT_COOKIE_NAME, JWT_COOKIE_NAME_DEFAULT));
jwtProperties.setOriginalUrlQueryParam(configuration.getString(JWT_ORIGINAL_URL_QUERY_PARAM, JWT_ORIGINAL_URL_QUERY_PARAM_DEFAULT)); jwtProperties.setOriginalUrlQueryParam(configuration.getString(JWT_ORIGINAL_URL_QUERY_PARAM, JWT_ORIGINAL_URL_QUERY_PARAM_DEFAULT));
String userAgent = configuration.getString(BROWSER_USERAGENT); String[] userAgent = configuration.getStringArray(BROWSER_USERAGENT);
if (userAgent != null && !userAgent.isEmpty()) { if (userAgent != null && userAgent.length > 0) {
jwtProperties.setUserAgentList(userAgent.split(",")); jwtProperties.setUserAgentList(userAgent);
} else {
jwtProperties.setUserAgentList(DEFAULT_BROWSER_USERAGENT.split(","));
} }
try { try {
RSAPublicKey publicKey = parseRSAPublicKey(publicKeyPathStr); RSAPublicKey publicKey = parseRSAPublicKey(publicKeyPathStr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment