SEC-1056: Remove deprecated FilterToBeanProxy: It's gone
This commit is contained in:
parent
3fcc7b5403
commit
aec23749d7
|
@ -1,193 +0,0 @@
|
||||||
/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.springframework.security.util;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.BeanFactoryUtils;
|
|
||||||
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
|
|
||||||
import org.springframework.web.context.support.WebApplicationContextUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>Delegates <code>Filter</code> requests to a Spring-managed bean.</p>
|
|
||||||
*
|
|
||||||
* <p>This class acts as a proxy on behalf of a
|
|
||||||
* target <code>Filter</code> that is defined in the Spring bean context. It is necessary to specify which target
|
|
||||||
* <code>Filter</code> should be proxied as a filter initialization parameter.</p>
|
|
||||||
*
|
|
||||||
* <p>On filter initialisation, the class will use Spring's {@link
|
|
||||||
* WebApplicationContextUtils#getWebApplicationContext(ServletContext sc)} method to obtain an
|
|
||||||
* <code>ApplicationContext</code> instance. It will expect to find the target <code>Filter</code> in this
|
|
||||||
* <code>ApplicationContext</code>.</p>
|
|
||||||
*
|
|
||||||
* <p>To use this filter, it is necessary to specify <b>one</b> of the following filter initialization parameters:
|
|
||||||
* <ul>
|
|
||||||
* <li><code>targetClass</code> indicates the class of the target <code>Filter</code> defined in the bean
|
|
||||||
* context. The only requirements are that this target class implements the <code>javax.servlet.Filter</code>
|
|
||||||
* interface and at least one instance is available in the <code>ApplicationContext</code>.</li>
|
|
||||||
* <li><code>targetBean</code> indicates the bean name of the target class.</li>
|
|
||||||
* </ul>
|
|
||||||
* If both initialization parameters are specified, <code>targetBean</code> takes priority.</p>
|
|
||||||
*
|
|
||||||
* <p>An additional
|
|
||||||
* initialization parameter, <code>init</code>, is also supported. If set to "<code>lazy</code>" the initialization
|
|
||||||
* will take place on the first HTTP request, rather than at filter creation time. This makes it possible to use
|
|
||||||
* <code>FilterToBeanProxy</code> with the Spring <code>ContextLoaderServlet</code>. Where possible you should not use
|
|
||||||
* this initialization parameter, instead using <code>ContextLoaderListener</code>.</p>
|
|
||||||
*
|
|
||||||
* <p>A final optional initialization parameter, <code>lifecycle</code>, determines whether the servlet container
|
|
||||||
* or the IoC container manages the lifecycle of the proxied filter. When possible you should write your filters to be
|
|
||||||
* managed via the IoC container interfaces such as {@link org.springframework.beans.factory.InitializingBean} and
|
|
||||||
* {@link org.springframework.beans.factory.DisposableBean}. If you cannot control the filters you wish to proxy (eg
|
|
||||||
* you do not have their source code) you might need to allow the servlet container to manage lifecycle via the {@link
|
|
||||||
* javax.servlet.Filter#init(javax.servlet.FilterConfig)} and {@link javax.servlet.Filter#destroy()} methods. If this
|
|
||||||
* case, set the <code>lifecycle</code> initialization parameter to <code>servlet-container-managed</code>. If the
|
|
||||||
* parameter is any other value, servlet container lifecycle methods will not be delegated through to the proxy.</p>
|
|
||||||
*
|
|
||||||
* @deprecated use DelegatingFilterProxy instead
|
|
||||||
* @author Ben Alex
|
|
||||||
* @version $Id$
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public class FilterToBeanProxy implements Filter {
|
|
||||||
//~ Instance fields ================================================================================================
|
|
||||||
|
|
||||||
private Filter delegate;
|
|
||||||
private FilterConfig filterConfig;
|
|
||||||
private boolean initialized = false;
|
|
||||||
private boolean servletContainerManaged = false;
|
|
||||||
|
|
||||||
//~ Methods ========================================================================================================
|
|
||||||
|
|
||||||
public void destroy() {
|
|
||||||
if ((delegate != null) && servletContainerManaged) {
|
|
||||||
delegate.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
|
||||||
throws IOException, ServletException {
|
|
||||||
if (!initialized) {
|
|
||||||
doInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate.doFilter(request, response, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void doInit() throws ServletException {
|
|
||||||
if (initialized) {
|
|
||||||
// already initialized, so don't re-initialize
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String targetBean = filterConfig.getInitParameter("targetBean");
|
|
||||||
|
|
||||||
if ("".equals(targetBean)) {
|
|
||||||
targetBean = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String lifecycle = filterConfig.getInitParameter("lifecycle");
|
|
||||||
|
|
||||||
if ("servlet-container-managed".equals(lifecycle)) {
|
|
||||||
servletContainerManaged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplicationContext ctx = this.getContext(filterConfig);
|
|
||||||
|
|
||||||
String beanName = null;
|
|
||||||
|
|
||||||
if ((targetBean != null) && ctx.containsBean(targetBean)) {
|
|
||||||
beanName = targetBean;
|
|
||||||
} else if (targetBean != null) {
|
|
||||||
throw new ServletException("targetBean '" + targetBean + "' not found in context");
|
|
||||||
} else {
|
|
||||||
String targetClassString = filterConfig.getInitParameter("targetClass");
|
|
||||||
|
|
||||||
if ((targetClassString == null) || "".equals(targetClassString)) {
|
|
||||||
throw new ServletException("targetClass or targetBean must be specified");
|
|
||||||
}
|
|
||||||
|
|
||||||
Class targetClass;
|
|
||||||
|
|
||||||
try {
|
|
||||||
targetClass = Thread.currentThread().getContextClassLoader().loadClass(targetClassString);
|
|
||||||
} catch (ClassNotFoundException ex) {
|
|
||||||
throw new ServletException("Class of type " + targetClassString + " not found in classloader");
|
|
||||||
}
|
|
||||||
|
|
||||||
Map beans = BeanFactoryUtils.beansOfTypeIncludingAncestors(ctx, targetClass, true, true);
|
|
||||||
|
|
||||||
if (beans.size() == 0) {
|
|
||||||
throw new ServletException("Bean context must contain at least one bean of type " + targetClassString);
|
|
||||||
}
|
|
||||||
|
|
||||||
beanName = (String) beans.keySet().iterator().next();
|
|
||||||
}
|
|
||||||
|
|
||||||
Object object = ctx.getBean(beanName);
|
|
||||||
|
|
||||||
if (!(object instanceof Filter)) {
|
|
||||||
throw new ServletException("Bean '" + beanName + "' does not implement javax.servlet.Filter");
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate = (Filter) object;
|
|
||||||
|
|
||||||
if (servletContainerManaged) {
|
|
||||||
delegate.init(filterConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set initialized to true at the end of the synchronized method, so
|
|
||||||
// that invocations of doFilter() before this method has completed will not
|
|
||||||
// cause NullPointerException
|
|
||||||
initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allows test cases to override where application context obtained from.
|
|
||||||
*
|
|
||||||
* @param filterConfig which can be used to find the <code>ServletContext</code>
|
|
||||||
*
|
|
||||||
* @return the Spring application context
|
|
||||||
*/
|
|
||||||
protected ApplicationContext getContext(FilterConfig filterConfig) {
|
|
||||||
return WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(FilterConfig filterConfig) throws ServletException {
|
|
||||||
this.filterConfig = filterConfig;
|
|
||||||
|
|
||||||
String strategy = filterConfig.getInitParameter("init");
|
|
||||||
|
|
||||||
if ((strategy != null) && strategy.toLowerCase().equals("lazy")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
doInit();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,249 +0,0 @@
|
||||||
/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.springframework.security.util;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import org.springframework.security.MockFilterConfig;
|
|
||||||
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
|
||||||
|
|
||||||
import org.springframework.mock.web.MockHttpServletRequest;
|
|
||||||
import org.springframework.mock.web.MockHttpServletResponse;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
|
||||||
import javax.servlet.FilterChain;
|
|
||||||
import javax.servlet.FilterConfig;
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.ServletRequest;
|
|
||||||
import javax.servlet.ServletResponse;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@link FilterToBeanProxy}.
|
|
||||||
*
|
|
||||||
* @author Ben Alex
|
|
||||||
* @version $Id$
|
|
||||||
*/
|
|
||||||
public class FilterToBeanProxyTests extends TestCase {
|
|
||||||
//~ Constructors ===================================================================================================
|
|
||||||
|
|
||||||
public FilterToBeanProxyTests() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public FilterToBeanProxyTests(String arg0) {
|
|
||||||
super(arg0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//~ Methods ========================================================================================================
|
|
||||||
|
|
||||||
private void executeFilterInContainerSimulator(FilterConfig filterConfig, Filter filter, ServletRequest request,
|
|
||||||
ServletResponse response, FilterChain filterChain)
|
|
||||||
throws ServletException, IOException {
|
|
||||||
filter.init(filterConfig);
|
|
||||||
filter.doFilter(request, response, filterChain);
|
|
||||||
filter.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
junit.textui.TestRunner.run(FilterToBeanProxyTests.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDetectsClassNotInClassLoader() throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetClass", "net.sf.DOES.NOT.EXIST");
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
try {
|
|
||||||
filter.init(config);
|
|
||||||
fail("Should have thrown ServletException");
|
|
||||||
} catch (ServletException expected) {
|
|
||||||
assertEquals("Class of type net.sf.DOES.NOT.EXIST not found in classloader", expected.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDetectsNeitherPropertyBeingSet() throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
try {
|
|
||||||
filter.init(config);
|
|
||||||
fail("Should have thrown ServletException");
|
|
||||||
} catch (ServletException expected) {
|
|
||||||
assertEquals("targetClass or targetBean must be specified", expected.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDetectsTargetBeanIsNotAFilter() throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetClass", "org.springframework.security.util.MockNotAFilter");
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
try {
|
|
||||||
filter.init(config);
|
|
||||||
fail("Should have thrown ServletException");
|
|
||||||
} catch (ServletException expected) {
|
|
||||||
assertEquals("Bean 'mockNotAFilter' does not implement javax.servlet.Filter", expected.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDetectsTargetBeanNotInBeanContext()
|
|
||||||
throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetBean", "WRONG_NAME");
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
try {
|
|
||||||
filter.init(config);
|
|
||||||
fail("Should have thrown ServletException");
|
|
||||||
} catch (ServletException expected) {
|
|
||||||
assertEquals("targetBean 'WRONG_NAME' not found in context", expected.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDetectsTargetClassNotInBeanContext()
|
|
||||||
throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetClass", "org.springframework.security.util.FilterToBeanProxyTests");
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
try {
|
|
||||||
filter.init(config);
|
|
||||||
fail("Should have thrown ServletException");
|
|
||||||
} catch (ServletException expected) {
|
|
||||||
assertEquals("Bean context must contain at least one bean of type org.springframework.security.util.FilterToBeanProxyTests",
|
|
||||||
expected.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testIgnoresEmptyTargetBean() throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetClass", "org.springframework.security.util.MockFilter");
|
|
||||||
config.setInitParmeter("targetBean", "");
|
|
||||||
|
|
||||||
// Setup our expectation that the filter chain will be invoked
|
|
||||||
MockFilterChain chain = new MockFilterChain(true);
|
|
||||||
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
executeFilterInContainerSimulator(config, filter, request, response, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testNormalOperationWithLazyTrue() throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetBean", "mockFilter");
|
|
||||||
config.setInitParmeter("init", "lazy");
|
|
||||||
|
|
||||||
// Setup our expectation that the filter chain will be invoked
|
|
||||||
MockFilterChain chain = new MockFilterChain(true);
|
|
||||||
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
executeFilterInContainerSimulator(config, filter, request, response, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testNormalOperationWithSpecificBeanName()
|
|
||||||
throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetBean", "mockFilter");
|
|
||||||
|
|
||||||
// Setup our expectation that the filter chain will be invoked
|
|
||||||
MockFilterChain chain = new MockFilterChain(true);
|
|
||||||
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
executeFilterInContainerSimulator(config, filter, request, response, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testNormalOperationWithTargetClass() throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetClass", "org.springframework.security.util.MockFilter");
|
|
||||||
|
|
||||||
// Setup our expectation that the filter chain will be invoked
|
|
||||||
MockFilterChain chain = new MockFilterChain(true);
|
|
||||||
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
executeFilterInContainerSimulator(config, filter, request, response, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testNullDelegateDoesNotCauseNullPointerException()
|
|
||||||
throws Exception {
|
|
||||||
// Setup our filter
|
|
||||||
MockFilterConfig config = new MockFilterConfig();
|
|
||||||
config.setInitParmeter("targetBean", "aFilterThatDoesntExist");
|
|
||||||
config.setInitParmeter("init", "lazy");
|
|
||||||
|
|
||||||
// Setup our expectation that the filter chain will be invoked
|
|
||||||
MockFilterChain chain = new MockFilterChain(true);
|
|
||||||
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
||||||
|
|
||||||
FilterToBeanProxy filter = new MockFilterToBeanProxy("org/springframework/security/util/filtertest-valid.xml");
|
|
||||||
|
|
||||||
// do not init (which would hapen if called .doFilter)
|
|
||||||
filter.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
//~ Inner Classes ==================================================================================================
|
|
||||||
|
|
||||||
private class MockFilterToBeanProxy extends FilterToBeanProxy {
|
|
||||||
private String appContextLocation;
|
|
||||||
|
|
||||||
public MockFilterToBeanProxy(String appContextLocation) {
|
|
||||||
this.appContextLocation = appContextLocation;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ApplicationContext getContext(FilterConfig filterConfig) {
|
|
||||||
return new ClassPathXmlApplicationContext(appContextLocation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue