Skip to content

Commit

Permalink
Unexpectedly, it works.
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed Jun 11, 2013
1 parent 054ee53 commit 1c7cee9
Show file tree
Hide file tree
Showing 3 changed files with 157 additions and 89 deletions.
@@ -1,3 +1,4 @@

package org.fcrepo.auth.oauth.integration.api;

import static java.util.Collections.emptyList;
Expand All @@ -10,11 +11,6 @@
import java.util.Map;

import javax.servlet.Filter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

//import com.sun.grizzly.servlet.ServletRegistration;
//import org.glassfish.grizzly.servlet.WebappContext;
import org.glassfish.grizzly.http.server.HttpServer;
Expand All @@ -26,100 +22,90 @@
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.core.servlet.WebAppResourceConfig;
import com.sun.jersey.core.spi.component.ioc.IoCComponentProviderFactory;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import com.sun.jersey.spi.spring.container.SpringComponentProviderFactory;
import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import com.sun.jersey.test.framework.WebAppDescriptor.Builder;
import com.sun.jersey.test.framework.WebAppDescriptor.FilterDescriptor;
import com.sun.jersey.test.framework.spi.container.TestContainer;
import com.sun.jersey.test.framework.spi.container.grizzly2.web.GrizzlyWebTestContainerFactory;

public class ContainerWrapper implements ApplicationContextAware {

private static final Logger logger = getLogger(ContainerWrapper.class);

private String contextConfigLocation = null;

private int port;

private HttpServer server;

private String packagesToScan = null;

private List<Filter> filters = emptyList();

private ApplicationContext applicationContext;

public void setPackagesToScan(final String packagesToScan) {
this.packagesToScan = packagesToScan;
}

public void setContextConfigLocation(final String contextConfigLocation) {
this.contextConfigLocation = contextConfigLocation;
}

public void setPort(final int port) {
this.port = port;
}

public void start() throws Exception {
JerseyTest jt;

final JerseyTest jt;

final URI uri = URI.create("http://localhost:" + port + "/");
Map<String,String> initParams = new HashMap<String, String>();

final Map<String, String> initParams = new HashMap<String, String>();

server = GrizzlyWebContainerFactory.create(uri, initParams);
WebappContext wac = new WebappContext("test", "");

final WebappContext wac = new WebappContext("test", "");

wac.addContextInitParameter("contextConfigLocation",
"classpath:spring-test/master.xml");
"classpath:spring-test/master.xml");

wac.addListener("org.springframework.web.context.ContextLoaderListener");
wac.addListener("org.springframework.web.context.request.RequestContextListener");

ServletRegistration servlet = wac.addServlet("jersey-servlet", SpringServlet.class);


final ServletRegistration servlet =
wac.addServlet("jersey-servlet", SpringServlet.class);

servlet.addMapping("/*");

servlet.setInitParameter("com.sun.jersey.config.property.packages", "org.fcrepo");

servlet.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
servlet.setInitParameter("com.sun.jersey.config.property.packages",
"org.fcrepo");

servlet.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature",
"true");

final FilterRegistration wrapFilter =
wac.addFilter("WrapFilter", DelegatingFilterProxy.class);

wrapFilter.setInitParameter("targetBeanName", "wrapFilter");

wrapFilter.addMappingForUrlPatterns(null,
"/rest/objects/authenticated/*");
wrapFilter
.addMappingForUrlPatterns(null, "/rest/objects/authenticated");

final FilterRegistration opFilter =
wac.addFilter("OpFilter", DelegatingFilterProxy.class);

FilterRegistration opFilter = wac.addFilter("OpFilter", DelegatingFilterProxy.class);

opFilter.setInitParameter("targetBeanName", "oauthFilter");

opFilter.addMappingForUrlPatterns(null, "/rest/objects/authenticated/*");
opFilter.addMappingForUrlPatterns(null, "/rest/objects/authenticated");

FilterRegistration tokenFilter = wac.addFilter("TokenFilter", DelegatingFilterProxy.class);


final FilterRegistration tokenFilter =
wac.addFilter("TokenFilter", DelegatingFilterProxy.class);

tokenFilter.setInitParameter("targetBeanName", "authNFilter");

tokenFilter.addMappingForUrlPatterns(null, "/token");

wac.deploy(server);

URL webXml = this.getClass().getResource("/web.xml");
logger.error(webXml.toString());
final URL webXml = this.getClass().getResource("/web.xml");
logger.error(webXml.toString());

logger.debug("started grizzly webserver endpoint at " +
server.getHttpHandler().getName());
}
Expand All @@ -132,11 +118,10 @@ public void setFilters(final List<Filter> filters) {
this.filters = filters;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;

}
@Override
public void setApplicationContext(
final ApplicationContext applicationContext) throws BeansException {

}

}
@@ -0,0 +1,75 @@

package org.fcrepo.auth.oauth.test.filter;

import static java.lang.reflect.Proxy.newProxyInstance;
import static org.slf4j.LoggerFactory.getLogger;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;

public class AuthenticatedRequestWrappingFilter implements Filter {

private static final Logger LOGGER =
getLogger(AuthenticatedRequestWrappingFilter.class);

@Override
public void init(final FilterConfig filterConfig) throws ServletException {
init();
}

// used by Spring
public void init() {
LOGGER.debug("Initialized {}", this.getClass().getName());
}

@Override
public void doFilter(final ServletRequest request,
final ServletResponse response, final FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;

try {
req.isUserInRole("");
} catch (final IllegalStateException e) {
// stupid grizzly doesn't impl isUserInRole(), so we have to stub it out
req =
(HttpServletRequest) newProxyInstance(req.getClass()
.getClassLoader(),
new Class[] {HttpServletRequest.class},
new InvocationHandler() {

@Override
public Object
invoke(final Object proxy,
final Method method,
final Object[] args)
throws Throwable {
if (method.getName().equals("isUserInRole")) {
return true;
}
return method.invoke(request, args);

}
});
}

chain.doFilter(req, response);

}

@Override
public void destroy() {
LOGGER.debug("Destroyed {}", this.getClass().getName());

}

}
60 changes: 34 additions & 26 deletions src/test/resources/spring-test/security.xml
@@ -1,34 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- Context that supports the actual ModeShape JCR itself -->
<!-- Context that supports the actual ModeShape JCR itself -->

<context:annotation-config/>
<context:annotation-config/>

<bean name="oauthFilter" class="org.fcrepo.auth.oauth.filter.OAuthFilter"
init-method="init">
<property name="realm" value="fedora"/>
<property name="provider">
<bean class="org.fcrepo.auth.oauth.DefaultOAuthResourceProvider">
<property name="sessionFactory">
<!-- mints JCR Sessions : needs to reappear here because it can't be autowired from the enclosed contexts-->
<ref bean="org.fcrepo.session.SessionFactory"/>
</property>
</bean>
</property>
<property name="parameterStyles">
<set
value-type="org.apache.oltu.oauth2.common.message.types.ParameterStyle">
<value>QUERY</value>
<value>HEADER</value>
</set>
</property>
</bean>

<bean name="wrapFilter"
class="org.fcrepo.auth.oauth.test.filter.AuthenticatedRequestWrappingFilter"
init-method="init"/>


<bean name="authNFilter"
class="org.fcrepo.auth.oauth.filter.RestrictToAuthNFilter"
init-method="init"/>

<bean name="oauthFilter" class="org.fcrepo.auth.oauth.filter.OAuthFilter" init-method="init">
<property name="realm" value="fedora"/>
<property name="provider">
<bean class="org.fcrepo.auth.oauth.DefaultOAuthResourceProvider">
<property name="sessionFactory">
<!-- mints JCR Sessions : needs to reappear here because it can't be autowired from the enclosed contexts-->
<ref bean="org.fcrepo.session.SessionFactory"/>
</property>
</bean>
</property>
<property name="parameterStyles">
<set
value-type="org.apache.oltu.oauth2.common.message.types.ParameterStyle">
<value>QUERY</value>
<value>HEADER</value>
</set>
</property>
</bean>

<bean name="authNFilter" class="org.fcrepo.auth.oauth.filter.RestrictToAuthNFilter" init-method="init" />

</beans>

0 comments on commit 1c7cee9

Please sign in to comment.