Repository: knox
Updated Branches:
  refs/heads/master c7da8f6b7 -> 1a50523f3


KNOX-1197 - Fix a bug where Anonymous auth is not picked up with federation 
provider


Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/1a50523f
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/1a50523f
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/1a50523f

Branch: refs/heads/master
Commit: 1a50523f32e1a8e2be69fce48d982df856639dad
Parents: c7da8f6
Author: Sandeep More <[email protected]>
Authored: Fri Mar 2 11:59:47 2018 -0500
Committer: Sandeep More <[email protected]>
Committed: Fri Mar 2 11:59:47 2018 -0500

----------------------------------------------------------------------
 .../ServiceDefinitionDeploymentContributor.java |   4 +
 .../ServiceDeploymentContributorBase.java       |   2 +-
 .../deploy/DeploymentFactoryFuncTest.java       | 117 +++++++++++++++++++
 3 files changed, 122 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/1a50523f/gateway-server/src/main/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributor.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributor.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributor.java
index 7e69af5..f450e17 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributor.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/deploy/impl/ServiceDefinitionDeploymentContributor.java
@@ -157,6 +157,10 @@ public class ServiceDefinitionDeploymentContributor 
extends ServiceDeploymentCon
       } else if ( topologyContainsProviderType(context, role) ) {
         context.contributeFilter(service, resource, role, 
policyBinding.getName(), null);
       }
+      /* handle the case where topology has federation provider but service 
defines Anonymous authentication see KNOX-1197 */
+      else if (role.equalsIgnoreCase("authentication") && 
topologyContainsProviderType(context, "federation")) {
+        context.contributeFilter(service, resource, role, 
policyBinding.getName(), null);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/1a50523f/gateway-spi/src/main/java/org/apache/knox/gateway/deploy/ServiceDeploymentContributorBase.java
----------------------------------------------------------------------
diff --git 
a/gateway-spi/src/main/java/org/apache/knox/gateway/deploy/ServiceDeploymentContributorBase.java
 
b/gateway-spi/src/main/java/org/apache/knox/gateway/deploy/ServiceDeploymentContributorBase.java
index deb994c..c691423 100644
--- 
a/gateway-spi/src/main/java/org/apache/knox/gateway/deploy/ServiceDeploymentContributorBase.java
+++ 
b/gateway-spi/src/main/java/org/apache/knox/gateway/deploy/ServiceDeploymentContributorBase.java
@@ -43,7 +43,7 @@ public abstract class ServiceDeploymentContributorBase 
extends DeploymentContrib
   }
 
   protected boolean topologyContainsProviderType(DeploymentContext context, 
String role) {
-    Provider provider = getProviderByRole(context, role);
+    final Provider provider = getProviderByRole(context, role);
     return (provider != null);
   }
   

http://git-wip-us.apache.org/repos/asf/knox/blob/1a50523f/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
 
b/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
index 8208e4f..08742b7 100644
--- 
a/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
+++ 
b/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
@@ -635,6 +635,123 @@ public class DeploymentFactoryFuncTest {
     LOG_EXIT();
   }
 
+  /**
+   * Test the case where topology has federation provider configured
+   * and service uses anonymous authentication in which case we should
+   * add AnonymousFilter to the filter chain.
+   * @since 1.1.0
+   * @throws IOException
+   * @throws SAXException
+   * @throws ParserConfigurationException
+   * @throws URISyntaxException
+   * @throws TransformerException
+   */
+  @Test( timeout = MEDIUM_TIMEOUT )
+  public void testServiceAnonAuth() throws IOException, SAXException, 
ParserConfigurationException, URISyntaxException, TransformerException {
+    LOG_ENTER();
+    final GatewayConfig config = new GatewayTestConfig();
+    ((GatewayTestConfig)config).setXForwardedEnabled(false);
+    final File targetDir = new File( System.getProperty( "user.dir" ), 
"target" );
+    final File gatewayDir = new File( targetDir, "gateway-home-" + 
UUID.randomUUID() );
+    gatewayDir.mkdirs();
+    ((GatewayTestConfig) config).setGatewayHomeDir( 
gatewayDir.getAbsolutePath() );
+    final File deployDir = new File( config.getGatewayDeploymentDir() );
+    deployDir.mkdirs();
+
+    final DefaultGatewayServices srvcs = new DefaultGatewayServices();
+    final Map<String,String> options = new HashMap<>();
+    options.put("persist-master", "false");
+    options.put("master", "password");
+    try {
+      DeploymentFactory.setGatewayServices(srvcs);
+      srvcs.init(config, options);
+    } catch (ServiceLifecycleException e) {
+      e.printStackTrace(); // I18N not required.
+    }
+
+    final Topology federationTopology = new Topology();
+    final Topology authenticationTopology = new Topology();
+
+    federationTopology.setName( "test-cluster" );
+    authenticationTopology.setName( "test-cluster" );
+
+    final Service service = new Service();
+    service.setRole( "RANGER" );
+    service.addUrl( "http://localhost:50070/"; );
+    federationTopology.addService( service );
+    authenticationTopology.addService( service );
+
+    /* Add federation provider to first topology */
+    final Provider provider = new Provider();
+    provider.setRole( "federation" );
+    provider.setName( "SSOCookieProvider" );
+    provider.setEnabled( true );
+    Param param = new Param();
+    param.setName( "sso.authentication.provider.url" );
+    param.setValue( "https://www.local.com:8443/gateway/knoxsso/api/v1/websso"; 
);
+    provider.addParam( param );
+    federationTopology.addProvider( provider );
+
+    /* Add authentication provider to second topology */
+    final Provider provider2 = new Provider();
+    provider2.setRole( "authentication" );
+    provider2.setName( "ShiroProvider" );
+    provider2.setEnabled( true );
+    Param param2 = new Param();
+    param2.setName( "contextConfigLocation" );
+    param2.setValue( "classpath:app-context-security.xml" );
+    provider2.addParam( param2 );
+    authenticationTopology.addProvider( provider2 );
+
+
+    final Provider asserter = new Provider();
+    asserter.setRole( "identity-assertion" );
+    asserter.setName("Default");
+    asserter.setEnabled( true );
+    federationTopology.addProvider( asserter );
+    Provider authorizer = new Provider();
+    authorizer.setRole( "authorization" );
+    authorizer.setName("AclsAuthz");
+    authorizer.setEnabled( true );
+    federationTopology.addProvider( authorizer );
+    authenticationTopology.addProvider( authorizer );
+
+    final EnterpriseArchive war = DeploymentFactory.createDeployment( config, 
federationTopology );
+    final EnterpriseArchive war2 = DeploymentFactory.createDeployment( config, 
federationTopology );
+
+    final Document web = XmlUtils.readXml( war.get( "%2F/WEB-INF/web.xml" 
).getAsset().openStream() );
+    final Document web2 = XmlUtils.readXml( war2.get( "%2F/WEB-INF/web.xml" 
).getAsset().openStream() );
+
+    /* Make sure AnonymousAuthFilter is added to the chain */
+    final Document gateway = XmlUtils.readXml( war.get( 
"%2F/WEB-INF/gateway.xml" ).getAsset().openStream() );
+
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/pattern", equalTo( 
"/ranger/service/public/**" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[1]/role", 
equalTo( "authentication" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[1]/class", 
equalTo( "org.apache.knox.gateway.filter.AnonymousAuthFilter" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[2]/role", 
equalTo( "rewrite" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[2]/class", 
equalTo( "org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletFilter" ) 
) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[3]/role", 
equalTo( "authorization" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[3]/class", 
equalTo( "org.apache.knox.gateway.filter.AclsAuthorizationFilter" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[4]/role", 
equalTo( "dispatch" ) ) );
+    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[4]/class", 
equalTo( "org.apache.knox.gateway.dispatch.GatewayDispatchFilter" ) ) );
+
+    final Document gateway2 = XmlUtils.readXml( war.get( 
"%2F/WEB-INF/gateway.xml" ).getAsset().openStream() );
+
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/pattern", equalTo( 
"/ranger/service/public/**" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[1]/role", 
equalTo( "authentication" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[1]/class", 
equalTo( "org.apache.knox.gateway.filter.AnonymousAuthFilter" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[2]/role", 
equalTo( "rewrite" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[2]/class", 
equalTo( "org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletFilter" ) 
) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[3]/role", 
equalTo( "authorization" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[3]/class", 
equalTo( "org.apache.knox.gateway.filter.AclsAuthorizationFilter" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[4]/role", 
equalTo( "dispatch" ) ) );
+    assertThat( gateway2, hasXPath( "/gateway/resource[1]/filter[4]/class", 
equalTo( "org.apache.knox.gateway.dispatch.GatewayDispatchFilter" ) ) );
+
+
+    LOG_EXIT();
+  }
+
+
   private Node node( Node scope, String expression ) throws 
XPathExpressionException {
     return (Node)XPathFactory.newInstance().newXPath().compile( expression 
).evaluate( scope, XPathConstants.NODE );
   }

Reply via email to