SEC-271: added method authoriztion BeanDefinition parser

This commit is contained in:
Vishal Puri 2007-07-06 13:37:18 +00:00
parent 0e46e5307c
commit 918f7ca008
16 changed files with 638 additions and 100 deletions

View File

@ -1,44 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry kind="src" path="src/main/java"/> <classpathentry kind="src" path="src/main/java"/>
<classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/> <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/> <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
<classpathentry excluding="**/*.java" kind="src" output="target/test-classes" path="src/test/resources"/> <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
<classpathentry kind="output" path="target/classes"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="var" path="M2_REPO/net/sf/ehcache/ehcache/1.2.4/ehcache-1.2.4.jar" sourcepath="M2_REPO/net/sf/ehcache/ehcache/1.2.4/ehcache-1.2.4-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar" sourcepath="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/aspectj/aspectjrt/1.2/aspectjrt-1.2.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/directory/server/apacheds-core-shared/1.0.0/apacheds-core-shared-1.0.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-context/2.0.4/spring-context-2.0.4.jar"/> <classpathentry kind="var" path="M2_REPO/org/springframework/spring-context/2.0.4/spring-context-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar" sourcepath="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-attributes/commons-attributes-api/2.1/commons-attributes-api-2.1.jar" sourcepath="M2_REPO/commons-attributes/commons-attributes-api/2.1/commons-attributes-api-2.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.1/commons-lang-2.1.jar" sourcepath="M2_REPO/commons-lang/commons-lang/2.1/commons-lang-2.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.0.1/slf4j-log4j12-1.0.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.0.1/slf4j-log4j12-1.0.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/acegisecurity/acegi-security-tiger/1.0.5-SNAPSHOT/acegi-security-tiger-1.0.5-SNAPSHOT.jar" sourcepath="M2_REPO/org/acegisecurity/acegi-security-tiger/1.0.5-SNAPSHOT/acegi-security-tiger-1.0.5-SNAPSHOT-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-beans/2.0.4/spring-beans-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/servlet/jsp-api/2.0/jsp-api-2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-remoting/2.0.4/spring-remoting-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-support/2.0.4/spring-support-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/cas/casclient/2.0.11/casclient-2.0.11.jar"/>
<classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" sourcepath="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-dao/2.0.4/spring-dao-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/directory/server/apacheds-core-shared/1.0.0/apacheds-core-shared-1.0.0.jar"/>
<classpathentry kind="var" path="M2_REPO/jmock/jmock/1.0.1/jmock-1.0.1.jar" sourcepath="M2_REPO/jmock/jmock/1.0.1/jmock-1.0.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/acegisecurity/acegi-security/1.0.5-SNAPSHOT/acegi-security-1.0.5-SNAPSHOT.jar" sourcepath="M2_REPO/org/acegisecurity/acegi-security/1.0.5-SNAPSHOT/acegi-security-1.0.5-SNAPSHOT-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/taglibs/standard/1.0.6/standard-1.0.6.jar" sourcepath="M2_REPO/taglibs/standard/1.0.6/standard-1.0.6-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/oro/oro/2.0.8/oro-2.0.8.jar" sourcepath="M2_REPO/oro/oro/2.0.8/oro-2.0.8-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/directory/shared/shared-asn1/0.9.5.3/shared-asn1-0.9.5.3.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-mock/2.0.4/spring-mock-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-jdbc/2.0.4/spring-jdbc-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-aop/2.0.4/spring-aop-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/hsqldb/hsqldb/1.8.0.4/hsqldb-1.8.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar" sourcepath="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4-sources.jar"/> <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar" sourcepath="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/directory/server/apacheds-core/1.0.0/apacheds-core-1.0.0.jar"/>
<classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.9/log4j-1.2.9.jar" sourcepath="M2_REPO/log4j/log4j/1.2.9/log4j-1.2.9-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/jdbm/jdbm/1.0/jdbm-1.0.jar"/>
<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/cas/casclient/2.0.11/casclient-2.0.11.jar"/>
<classpathentry kind="var" path="M2_REPO/hsqldb/hsqldb/1.8.0.4/hsqldb-1.8.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/qdox/qdox/1.5/qdox-1.5.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/directory/shared/shared-ldap/0.9.5.3/shared-ldap-0.9.5.3.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/directory/shared/shared-ldap/0.9.5.3/shared-ldap-0.9.5.3.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-sources.jar"/> <classpathentry kind="var" path="M2_REPO/taglibs/standard/1.0.6/standard-1.0.6.jar" sourcepath="M2_REPO/taglibs/standard/1.0.6/standard-1.0.6-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/jmock/jmock/1.0.1/jmock-1.0.1.jar" sourcepath="M2_REPO/jmock/jmock/1.0.1/jmock-1.0.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/directory/server/apacheds-core/1.0.0/apacheds-core-1.0.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/directory/shared/shared-asn1/0.9.5.3/shared-asn1-0.9.5.3.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/servlet/jsp-api/2.0/jsp-api-2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-web/2.0.4/spring-web-2.0.4.jar"/> <classpathentry kind="var" path="M2_REPO/org/springframework/spring-web/2.0.4/spring-web-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar" sourcepath="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/springframework/spring-support/2.0.4/spring-support-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-core/2.0.4/spring-core-2.0.4.jar" sourcepath="/spring"/> <classpathentry kind="var" path="M2_REPO/org/springframework/spring-dao/2.0.4/spring-dao-2.0.4.jar"/>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="var" path="M2_REPO/org/acegisecurity/acegi-security/1.0.5-SNAPSHOT/acegi-security-1.0.5-SNAPSHOT.jar" sourcepath="M2_REPO/org/acegisecurity/acegi-security/1.0.5-SNAPSHOT/acegi-security-1.0.5-SNAPSHOT-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.9/log4j-1.2.9.jar" sourcepath="M2_REPO/log4j/log4j/1.2.9/log4j-1.2.9-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-attributes/commons-attributes-compiler/2.1/commons-attributes-compiler-2.1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-remoting/2.0.4/spring-remoting-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar" sourcepath="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-mock/2.0.4/spring-mock-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/jdbm/jdbm/1.0/jdbm-1.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-aop/2.0.4/spring-aop-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.0.1/slf4j-log4j12-1.0.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.0.1/slf4j-log4j12-1.0.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-jdbc/2.0.4/spring-jdbc-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.1/commons-lang-2.1.jar" sourcepath="M2_REPO/commons-lang/commons-lang/2.1/commons-lang-2.1-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-beans/2.0.4/spring-beans-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/oro/oro/2.0.8/oro-2.0.8.jar" sourcepath="M2_REPO/oro/oro/2.0.8/oro-2.0.8-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-core/2.0.4/spring-core-2.0.4.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/aspectj/aspectjrt/1.2/aspectjrt-1.2.jar"/>
<classpathentry kind="var" path="M2_REPO/ant/ant/1.5/ant-1.5.jar"/>
<classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" sourcepath="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/net/sf/ehcache/ehcache/1.2.4/ehcache-1.2.4.jar" sourcepath="M2_REPO/net/sf/ehcache/ehcache/1.2.4/ehcache-1.2.4-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/acegisecurity/acegi-security-tiger/1.0.5-SNAPSHOT/acegi-security-tiger-1.0.5-SNAPSHOT.jar" sourcepath="M2_REPO/org/acegisecurity/acegi-security-tiger/1.0.5-SNAPSHOT/acegi-security-tiger-1.0.5-SNAPSHOT-sources.jar"/>
</classpath> </classpath>

View File

@ -72,6 +72,23 @@
<artifactId>commons-collections</artifactId> <artifactId>commons-collections</artifactId>
<version>3.1</version> <version>3.1</version>
</dependency> </dependency>
<dependency>
<groupId>commons-attributes</groupId>
<artifactId>commons-attributes-compiler</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>commons-attributes</groupId>
<artifactId>commons-attributes-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>commons-attributes</groupId>
<artifactId>commons-attributes-plugin</artifactId>
<version>2.1</version>
<type>plugin</type>
</dependency>
<dependency> <dependency>
<groupId>aspectj</groupId> <groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId> <artifactId>aspectjrt</artifactId>

View File

@ -0,0 +1,217 @@
package org.acegisecurity.config;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.acegisecurity.annotation.SecurityAnnotationAttributes;
import org.acegisecurity.intercept.method.MethodDefinitionAttributes;
import org.acegisecurity.intercept.method.MethodDefinitionMap;
import org.acegisecurity.intercept.method.MethodDefinitionSource;
import org.acegisecurity.intercept.method.MethodDefinitionSourceMapping;
import org.acegisecurity.intercept.method.aopalliance.MethodDefinitionSourceAdvisor;
import org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor;
import org.acegisecurity.intercept.method.aspectj.AspectJSecurityInterceptor;
import org.acegisecurity.runas.RunAsManagerImpl;
import org.acegisecurity.util.BeanDefinitionParserUtils;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.metadata.commons.CommonsAttributes;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
/**
*
* @author Vishal Puri
*
*/
public class AuthorizationMethodBeanDefinitionParser extends AbstractBeanDefinitionParser implements
BeanDefinitionParser {
// ~ static initializers
// ================================================================================================
public static final String ASPECTJ_ATTRIBUTE = "aspectj";
public static final String SPRING_AOP_ATTRIBUTE = "springAop";
public static final String SOURCE_ATTRIBUTE = "source";
public static final String SOURCE_BEAN_REF = "sourceBeanId";
public static final String ATTRIBUTE = "attribute";
private static final String CONFIGURATION_ATTRIBUTE = "configuration-attribute";
private static final String TYPE_ATTRIBUTE = "type";
// ~ Method
// ================================================================================================
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
// <security:authorization-joinpoint aspectj="false|true"
// springAop="true|false">
// one attribute allowed, aspectj or springAop
Assert.isTrue(!(element.hasAttribute(SPRING_AOP_ATTRIBUTE) && element.hasAttribute(ASPECTJ_ATTRIBUTE)),
"only one attribute (springAop or aspectj) is allowed");
Element urlMappingEle = DomUtils.getChildElementByTagName(element, "url-mapping");
String sourceBeanId = urlMappingEle.getAttribute(SOURCE_BEAN_REF);
boolean isSourceBeanIdDefined = StringUtils.hasLength(sourceBeanId);
if (!isValidConfiguration(urlMappingEle, isSourceBeanIdDefined)) {
throw new IllegalArgumentException(
" 'custom' value provided by 'source' attribute need to be selected when referring to a bean by 'sourceBeanId' attribute ");
}
if ((element.hasAttribute(ASPECTJ_ATTRIBUTE)) && element.getAttribute(ASPECTJ_ATTRIBUTE).equals("true")) {
// create AspectJSecurityInterceptor
if (isSourceBeanIdDefined)
return createMethodSecurityInterceptor(AspectJSecurityInterceptor.class, new RuntimeBeanReference(
sourceBeanId));
return createMethodSecurityInterceptor(AspectJSecurityInterceptor.class, createObjectDefinitionSource(
parserContext, urlMappingEle));
}
else if ((element.hasAttribute(SPRING_AOP_ATTRIBUTE))
&& element.getAttribute(SPRING_AOP_ATTRIBUTE).equals("true")) {
// create MethodSecurityInterceptor and
// MethodDefinitionSourceAdvisor
if (isSourceBeanIdDefined)
return createMethodSecurityInterceptor(MethodSecurityInterceptor.class, new RuntimeBeanReference(
sourceBeanId));
return createMethodSecurityInterceptor(MethodSecurityInterceptor.class, createObjectDefinitionSource(
parserContext, urlMappingEle));
}
return null;
}
/**
* @param parserContext
* @param firstChild
* @param sourceValue
* @throws BeanDefinitionStoreException
*/
private MethodDefinitionSource createObjectDefinitionSource(ParserContext parserContext, Element element)
throws BeanDefinitionStoreException {
String sourceValue = element.getAttribute(SOURCE_ATTRIBUTE);
if (sourceValue.equals("xml")) {
// create MethodDefinitionSourceEditor
Element methodPattern = DomUtils.getChildElementByTagName(element, "method-pattern");
String methodToProtect = methodPattern.getAttribute(TYPE_ATTRIBUTE);
MethodDefinitionSourceMapping mapping = new MethodDefinitionSourceMapping();
MethodDefinitionMap source = new MethodDefinitionMap();
List<MethodDefinitionSourceMapping> mappings = new ArrayList<MethodDefinitionSourceMapping>();
mapping.setMethodName(methodToProtect);
List configAttributes = DomUtils.getChildElementsByTagName(methodPattern, CONFIGURATION_ATTRIBUTE);
for (Iterator iter = configAttributes.iterator(); iter.hasNext();) {
Element configAttribute = (Element) iter.next();
String configAttributeValue = configAttribute.getAttribute(ATTRIBUTE);
mapping.addConfigAttribute(configAttributeValue);
}
mappings.add(mapping);
source.setMappings(mappings);
return source;
}
else if (sourceValue.equals("annotations")) {
BeanDefinitionParserUtils.registerBeanDefinition(parserContext, new RootBeanDefinition(
DefaultAdvisorAutoProxyCreator.class));
MethodDefinitionAttributes source = new MethodDefinitionAttributes();
SecurityAnnotationAttributes attributes = new SecurityAnnotationAttributes();
source.setAttributes(attributes);
return source;
}
else if (sourceValue.equals("attributes")) {
// create CommonsAttributes
CommonsAttributes attributes = new CommonsAttributes();
// objectDefinitionSource and inject attributes
MethodDefinitionAttributes source = new MethodDefinitionAttributes();
source.setAttributes(attributes);
// register DefaultAdvisorAutoProxyCreator with parseContext
BeanDefinitionParserUtils.registerBeanDefinition(parserContext, new RootBeanDefinition(
DefaultAdvisorAutoProxyCreator.class));
// register MethodDefinitionSourceAdvisor autowire="constructor"
registerMethodDefinitionSourceAdvisor(parserContext);
return source;
}
return null;
}
/**
* @param parserContext
* @throws BeanDefinitionStoreException
*/
private void registerMethodDefinitionSourceAdvisor(ParserContext parserContext) throws BeanDefinitionStoreException {
RootBeanDefinition methodSecurityAdvisor = new RootBeanDefinition(MethodDefinitionSourceAdvisor.class);
methodSecurityAdvisor.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
BeanDefinitionParserUtils.registerBeanDefinition(parserContext, methodSecurityAdvisor);
}
/**
* Creates BeanDefinition for MethodSecurityInterceptor
* MethodSecurityInterceptor autodetects 'authenticationManager' and
* 'accessDecisionManager'
* @param name
*
* @return
*/
private RootBeanDefinition createMethodSecurityInterceptor(Class interceptorType, Object object) {
Assert.notNull(object, "objectDefinitionSource required");
RootBeanDefinition securityInterceptor = new RootBeanDefinition(interceptorType);
if (RuntimeBeanReference.class.isAssignableFrom(object.getClass())) {
RuntimeBeanReference source = (RuntimeBeanReference) object;
securityInterceptor.getPropertyValues().addPropertyValue("objectDefinitionSource", source);
}
else if (MethodDefinitionSource.class.isAssignableFrom(object.getClass())) {
MethodDefinitionSource source = (MethodDefinitionSource) object;
securityInterceptor.getPropertyValues().addPropertyValue("objectDefinitionSource", source);
}
securityInterceptor.getPropertyValues().addPropertyValue("validateConfigAttributes", Boolean.FALSE);
RootBeanDefinition runAsManager = createRunAsManager();
securityInterceptor.getPropertyValues().addPropertyValue("runAsManager", runAsManager);
return securityInterceptor;
}
private RootBeanDefinition createRunAsManager() {
RootBeanDefinition runAsManager = new RootBeanDefinition(RunAsManagerImpl.class);
runAsManager.getPropertyValues().addPropertyValue("key", "my_run_as_password");
return runAsManager;
}
/**
* Checks if 'custom' option is picked for 'source' attribute when
* 'sourceBeanId' attribute is provided.
* <p>
* The valid configuration example:<br/> &lt;security:url-mapping
* source="custom" sourceBeanId="referenceToObjectDefinitionSource"/&gt;
* </p>
* @param urlMappingElement
* @return boolean Returns 'true' if configuration is accepted otherwise
* returns 'false'
*/
private boolean isValidConfiguration(Element urlMappingElement, boolean isRefDefined) {
Assert.notNull(urlMappingElement, "invalid tag - expected 'url-mapping' ");
Assert.isTrue(urlMappingElement.getLocalName().equals("url-mapping"), "invalid tag - expected 'url-mapping' ");
if (isRefDefined && (urlMappingElement.getAttribute(SOURCE_ATTRIBUTE).compareTo("custom") != 0)) {
return false;
}
return true;
}
}

View File

@ -4,9 +4,10 @@
package org.acegisecurity.config; package org.acegisecurity.config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.acegisecurity.AuthenticationManager;
import org.acegisecurity.annotation.SecurityAnnotationAttributes; import org.acegisecurity.annotation.SecurityAnnotationAttributes;
import org.acegisecurity.intercept.method.MethodDefinitionAttributes; import org.acegisecurity.intercept.method.MethodDefinitionAttributes;
import org.acegisecurity.intercept.method.aopalliance.MethodDefinitionSourceAdvisor; import org.acegisecurity.intercept.method.aopalliance.MethodDefinitionSourceAdvisor;
@ -16,6 +17,8 @@ import org.acegisecurity.intercept.web.FilterInvocationDefinitionSourceMapping;
import org.acegisecurity.intercept.web.FilterSecurityInterceptor; import org.acegisecurity.intercept.web.FilterSecurityInterceptor;
import org.acegisecurity.intercept.web.PathBasedFilterInvocationDefinitionMap; import org.acegisecurity.intercept.web.PathBasedFilterInvocationDefinitionMap;
import org.acegisecurity.runas.RunAsManagerImpl; import org.acegisecurity.runas.RunAsManagerImpl;
import org.acegisecurity.userdetails.memory.InMemoryDaoImpl;
import org.acegisecurity.util.BeanDefinitionParserUtils;
import org.acegisecurity.vote.AffirmativeBased; import org.acegisecurity.vote.AffirmativeBased;
import org.acegisecurity.vote.AuthenticatedVoter; import org.acegisecurity.vote.AuthenticatedVoter;
import org.acegisecurity.vote.RoleVoter; import org.acegisecurity.vote.RoleVoter;
@ -27,6 +30,7 @@ import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;
/** /**
@ -73,12 +77,14 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser {
// filter security interceptor // filter security interceptor
createAndRegisterBeanDefinitionForFilterSecurityInterceptor(parserContext, authenticationManager); createAndRegisterBeanDefinitionForFilterSecurityInterceptor(parserContext, authenticationManager);
// create userDetailsService
return null; return null;
} }
private void createAndRegisterBeanDefintionForSecurityContextHolderAwareRequestFilter(ParserContext parserContext) { private void createAndRegisterBeanDefintionForSecurityContextHolderAwareRequestFilter(ParserContext parserContext) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(SecurityContextHolderAwareRequestFilter.class); RootBeanDefinition beanDefinition = new RootBeanDefinition(SecurityContextHolderAwareRequestFilter.class);
registerBeanDefinition(parserContext, beanDefinition); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, beanDefinition);
} }
/** /**
@ -120,7 +126,7 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser {
source.setMappings(mappings); source.setMappings(mappings);
filterInvocationInterceptor.getPropertyValues().addPropertyValue("objectDefinitionSource", filterInvocationInterceptor.getPropertyValues().addPropertyValue("objectDefinitionSource",
source.getDecorated()); source.getDecorated());
registerBeanDefinition(parserContext, filterInvocationInterceptor); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, filterInvocationInterceptor);
} }
private RootBeanDefinition createAccessDecisionManagerAffirmativeBased() { private RootBeanDefinition createAccessDecisionManagerAffirmativeBased() {
@ -133,7 +139,8 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser {
} }
private void createAndRegisterDefaultAdvisorAutoProxyCreator(ParserContext parserContext) { private void createAndRegisterDefaultAdvisorAutoProxyCreator(ParserContext parserContext) {
registerBeanDefinition(parserContext, new RootBeanDefinition(DefaultAdvisorAutoProxyCreator.class)); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, new RootBeanDefinition(
DefaultAdvisorAutoProxyCreator.class));
} }
private void createAndRegisterBeanDefinitinoForMethodDefinitionSourceAdvisor(ParserContext parserContext, private void createAndRegisterBeanDefinitinoForMethodDefinitionSourceAdvisor(ParserContext parserContext,
@ -142,23 +149,18 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser {
RootBeanDefinition securityInterceptor = createMethodSecurityInterceptor(authenticationManager); RootBeanDefinition securityInterceptor = createMethodSecurityInterceptor(authenticationManager);
methodSecurityAdvisor.getConstructorArgumentValues().addIndexedArgumentValue(0, securityInterceptor); methodSecurityAdvisor.getConstructorArgumentValues().addIndexedArgumentValue(0, securityInterceptor);
registerBeanDefinition(parserContext, methodSecurityAdvisor); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, methodSecurityAdvisor);
} }
private RootBeanDefinition createAccessDecisionManagerUnanimousBased() { private RootBeanDefinition createAccessDecisionManagerUnanimousBased() {
RootBeanDefinition accessDecisionManager = new RootBeanDefinition(UnanimousBased.class); RootBeanDefinition accessDecisionManager = new RootBeanDefinition(UnanimousBased.class);
accessDecisionManager.getPropertyValues().addPropertyValue("allowIfAllAbstainDecisions", Boolean.FALSE); accessDecisionManager.getPropertyValues().addPropertyValue("allowIfAllAbstainDecisions", Boolean.FALSE);
RootBeanDefinition roleVoter = createRoleVoter(); decisionVoters.add(new RootBeanDefinition(RoleVoter.class));
decisionVoters.add(roleVoter);
accessDecisionManager.getPropertyValues().addPropertyValue("decisionVoters", decisionVoters); accessDecisionManager.getPropertyValues().addPropertyValue("decisionVoters", decisionVoters);
return accessDecisionManager; return accessDecisionManager;
} }
private RootBeanDefinition createRoleVoter() {
return new RootBeanDefinition(RoleVoter.class);
}
private RootBeanDefinition createMethodSecurityInterceptor(RootBeanDefinition authenticationManager) { private RootBeanDefinition createMethodSecurityInterceptor(RootBeanDefinition authenticationManager) {
RootBeanDefinition securityInterceptor = new RootBeanDefinition(MethodSecurityInterceptor.class); RootBeanDefinition securityInterceptor = new RootBeanDefinition(MethodSecurityInterceptor.class);
securityInterceptor.getPropertyValues().addPropertyValue("authenticationManager", authenticationManager); securityInterceptor.getPropertyValues().addPropertyValue("authenticationManager", authenticationManager);
@ -190,45 +192,36 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser {
} }
private void createAndRegisterBeanDefinitionForExceptionTranslationFilter(ParserContext parserContext) { private void createAndRegisterBeanDefinitionForExceptionTranslationFilter(ParserContext parserContext) {
registerBeanDefinition(parserContext, ExceptionTranslationFilterBeanDefinitionParser BeanDefinitionParserUtils.registerBeanDefinition(parserContext, ExceptionTranslationFilterBeanDefinitionParser
.createBeanDefinitionWithDefaults()); .createBeanDefinitionWithDefaults());
} }
private void createAndRegisterBeanDefinitionForRememberMeProcessingFilter(ParserContext parserContext, private void createAndRegisterBeanDefinitionForRememberMeProcessingFilter(ParserContext parserContext,
RootBeanDefinition authenticationManager) { RootBeanDefinition authenticationManager) {
registerBeanDefinition(parserContext, RememberMeFilterBeanDefinitionParser.createBeanDefinitionWithDefaults( BeanDefinitionParserUtils.registerBeanDefinition(parserContext, RememberMeFilterBeanDefinitionParser
parserContext, authenticationManager)); .createBeanDefinitionWithDefaults(parserContext, authenticationManager));
} }
private void createAndRegisterBeanDefinitionForAuthenticationProcessingFilter(ParserContext parserContext, private void createAndRegisterBeanDefinitionForAuthenticationProcessingFilter(ParserContext parserContext,
RootBeanDefinition authenticationManager, RootBeanDefinition rememberMeServices) { RootBeanDefinition authenticationManager, RootBeanDefinition rememberMeServices) {
RootBeanDefinition defintion = AuthenticationProcessingFilterBeanDefinitionParser RootBeanDefinition defintion = AuthenticationProcessingFilterBeanDefinitionParser
.createBeandefinitionWithDefaults(parserContext, authenticationManager, rememberMeServices); .createBeandefinitionWithDefaults(parserContext, authenticationManager, rememberMeServices);
registerBeanDefinition(parserContext, defintion); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, defintion);
} }
private void createAndRegisterBeanDefinitionForLogoutFilter(ParserContext parserContext, private void createAndRegisterBeanDefinitionForLogoutFilter(ParserContext parserContext,
RootBeanDefinition rememberMeServices) { RootBeanDefinition rememberMeServices) {
RootBeanDefinition defintion = LogoutFilterBeanDefinitionParser RootBeanDefinition defintion = LogoutFilterBeanDefinitionParser
.createBeanDefinitionWithDefaults(rememberMeServices); .createBeanDefinitionWithDefaults(rememberMeServices);
registerBeanDefinition(parserContext, defintion); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, defintion);
} }
private void createAndRegisterBeanDefinitionForHttpSessionContextIntegrationFilter(ParserContext parserContext) { private void createAndRegisterBeanDefinitionForHttpSessionContextIntegrationFilter(ParserContext parserContext) {
RootBeanDefinition defintion = ContextIntegrationBeanDefinitionParser.createBeanDefinitionWithDefaults(); RootBeanDefinition defintion = ContextIntegrationBeanDefinitionParser.createBeanDefinitionWithDefaults();
registerBeanDefinition(parserContext, defintion); BeanDefinitionParserUtils.registerBeanDefinition(parserContext, defintion);
// retrieveBeanDefinition(parserContext, o) // retrieveBeanDefinition(parserContext, o)
} }
/**
* @param parserContext
* @param defintion
*/
private void registerBeanDefinition(ParserContext parserContext, RootBeanDefinition defintion) {
parserContext.getRegistry().registerBeanDefinition(
parserContext.getReaderContext().generateBeanName(defintion), defintion);
}
/** /**
* Returns a <code>BeanDefinition</code> of the specified type. * Returns a <code>BeanDefinition</code> of the specified type.
* *
@ -247,7 +240,4 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser {
return null; return null;
} }
private Class ss(Object o) {
return o.getClass();
}
} }

View File

@ -26,6 +26,8 @@ import org.w3c.dom.Node;
* *
*/ */
public class FilterSecurityInterceptorBeanDefinitionParser extends AbstractBeanDefinitionParser { public class FilterSecurityInterceptorBeanDefinitionParser extends AbstractBeanDefinitionParser {
// ~ static initializers
// ================================================================================================
private static final String OBJECT_DEFINITION_SOURCE_PROPERTY = "objectDefinitionSource"; private static final String OBJECT_DEFINITION_SOURCE_PROPERTY = "objectDefinitionSource";
@ -37,6 +39,9 @@ public class FilterSecurityInterceptorBeanDefinitionParser extends AbstractBeanD
private static final String CONFIGURATION_ATTRIB_ATTRIBUTE = "attribute"; private static final String CONFIGURATION_ATTRIB_ATTRIBUTE = "attribute";
// ~ Methods
// ================================================================================================
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
return createBeanDefinitionForFilterSecurityInterceptor(element, parserContext); return createBeanDefinitionForFilterSecurityInterceptor(element, parserContext);
} }
@ -45,7 +50,8 @@ public class FilterSecurityInterceptorBeanDefinitionParser extends AbstractBeanD
ParserContext parserContext) { ParserContext parserContext) {
RootBeanDefinition filterInvocationInterceptor = new RootBeanDefinition(FilterSecurityInterceptor.class); RootBeanDefinition filterInvocationInterceptor = new RootBeanDefinition(FilterSecurityInterceptor.class);
RootBeanDefinition accessDecisionManager = AuthorizationManagerBeanDefinitionParser.createAccessDecisionManagerAffirmativeBased(); RootBeanDefinition accessDecisionManager = AuthorizationManagerBeanDefinitionParser
.createAccessDecisionManagerAffirmativeBased();
filterInvocationInterceptor.getPropertyValues() filterInvocationInterceptor.getPropertyValues()
.addPropertyValue("accessDecisionManager", accessDecisionManager); .addPropertyValue("accessDecisionManager", accessDecisionManager);
@ -56,8 +62,12 @@ public class FilterSecurityInterceptorBeanDefinitionParser extends AbstractBeanD
Element firstChild = DomUtils.getChildElementByTagName(element, "url-mapping"); Element firstChild = DomUtils.getChildElementByTagName(element, "url-mapping");
// if 'url-mapping' element is defined // if 'url-mapping' element is defined
if (firstChild != null) { if (firstChild != null) {
BeanDefinitionParserUtils.setPropertyIfAvailable(firstChild, OBJECT_DEFINITION_SOURCE_REF_ATTRIBUTE,
OBJECT_DEFINITION_SOURCE_PROPERTY, true/* RuntimeBeanReference */, filterInvocationInterceptor); if (BeanDefinitionParserUtils.setPropertyIfAvailable(firstChild, OBJECT_DEFINITION_SOURCE_REF_ATTRIBUTE,
OBJECT_DEFINITION_SOURCE_PROPERTY, true/* RuntimeBeanReference */, filterInvocationInterceptor)) {
return filterInvocationInterceptor;
}
// get 'uri-pattern' or 'path' attribute. not both can be specified // get 'uri-pattern' or 'path' attribute. not both can be specified
// together // together
List uriPatternElements = DomUtils.getChildElementsByTagName(firstChild, "uri-pattern"); List uriPatternElements = DomUtils.getChildElementsByTagName(firstChild, "uri-pattern");
@ -145,11 +155,9 @@ public class FilterSecurityInterceptorBeanDefinitionParser extends AbstractBeanD
mappings.add(mapping); mappings.add(mapping);
source.setMappings(mappings); source.setMappings(mappings);
filterInvocationInterceptor.getPropertyValues().addPropertyValue("objectDefinitionSource", filterInvocationInterceptor.getPropertyValues().addPropertyValue(OBJECT_DEFINITION_SOURCE_PROPERTY,
source.getDecorated()); source.getDecorated());
return filterInvocationInterceptor; return filterInvocationInterceptor;
} }
} }

View File

@ -3,8 +3,13 @@
*/ */
package org.acegisecurity.config; package org.acegisecurity.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.GrantedAuthorityImpl; import org.acegisecurity.GrantedAuthorityImpl;
import org.acegisecurity.userdetails.User; import org.acegisecurity.userdetails.User;
import org.acegisecurity.userdetails.UserDetails; import org.acegisecurity.userdetails.UserDetails;
@ -143,6 +148,15 @@ public class PrincipalRepositoryBeanDefinitionParser extends AbstractBeanDefinit
return parserContext.getReaderContext().registerWithGeneratedName(defintion); return parserContext.getReaderContext().registerWithGeneratedName(defintion);
} }
protected static RootBeanDefinition createSampleUsersUsingProperties() {
// properties element
RootBeanDefinition defintion = new RootBeanDefinition(PropertiesFactoryBean.class);
String location = "classpath:org/acegisecurity/config/user.properties";
defintion.getPropertyValues().addPropertyValue("location", location);
return defintion;
}
/** /**
* *
* @param elementToParse * @param elementToParse

View File

@ -30,6 +30,7 @@ public class SecurityNamespaceHandler extends NamespaceHandlerSupport {
registerBeanDefinitionParser("authentication-form", new AuthenticationProcessingFilterBeanDefinitionParser()); registerBeanDefinitionParser("authentication-form", new AuthenticationProcessingFilterBeanDefinitionParser());
registerBeanDefinitionParser("authorization-manager", new AuthorizationManagerBeanDefinitionParser()); registerBeanDefinitionParser("authorization-manager", new AuthorizationManagerBeanDefinitionParser());
registerBeanDefinitionParser("authorization-http-url", new FilterSecurityInterceptorBeanDefinitionParser()); registerBeanDefinitionParser("authorization-http-url", new FilterSecurityInterceptorBeanDefinitionParser());
registerBeanDefinitionParser("authorization-joinpoint", new AuthorizationMethodBeanDefinitionParser());
registerBeanDefinitionParser("autoconfig", new AutoConfigBeanDefinitionParser()); registerBeanDefinitionParser("autoconfig", new AutoConfigBeanDefinitionParser());
} }

View File

@ -4,12 +4,15 @@
package org.acegisecurity.util; package org.acegisecurity.util;
import org.springframework.beans.factory.config.RuntimeBeanNameReference; import org.springframework.beans.factory.config.RuntimeBeanNameReference;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;
/** /**
* The convenience methods for the parsing of bean definition xml file.
*
* @author Vishal Puri * @author Vishal Puri
* *
*/ */
@ -40,17 +43,46 @@ public class BeanDefinitionParserUtils {
} }
} }
public static void setPropertyIfAvailable(Element element, String attribute, String property, /**
* <p>
* Configure a <code>BeanDefinition</code>with the property value
* retrieved from xml attribute. If the attribute is like a standard spring
* 'ref' attribute as indicated by 'isRunTimeBeanReference', the property
* will be resolved as a reference to the spring bean.
* </p>
*
* @param element The parent element.
* @param attribute The child attribute.
* @param property The configuration property for the BeanDefinition
* @param isRunTimeBeanReference Indicates if the property is like a
* standard spring 'ref' attribute.
* @param definition The BeanDefinition to configure with the property
* provided.
* @return boolean To indicate if BeanDefinition was configured with a
* property.
*/
public static boolean setPropertyIfAvailable(Element element, String attribute, String property,
boolean isRunTimeBeanReference, RootBeanDefinition definition) { boolean isRunTimeBeanReference, RootBeanDefinition definition) {
String propertyValue = element.getAttribute(attribute); String propertyValue = element.getAttribute(attribute);
if (StringUtils.hasText(propertyValue)) { if (StringUtils.hasText(propertyValue)) {
if (!isRunTimeBeanReference) { if (!isRunTimeBeanReference) {
definition.getPropertyValues().addPropertyValue(property, propertyValue); definition.getPropertyValues().addPropertyValue(property, propertyValue);
return true;
} }
else { else {
definition.getPropertyValues().addPropertyValue(property, new RuntimeBeanNameReference(propertyValue)); definition.getPropertyValues().addPropertyValue(property, new RuntimeBeanReference(propertyValue));
return true;
}
}
return false;
} }
} /**
* @param parserContext
* @param defintion
*/
public static void registerBeanDefinition(ParserContext parserContext, RootBeanDefinition defintion) {
parserContext.getRegistry().registerBeanDefinition(
parserContext.getReaderContext().generateBeanName(defintion), defintion);
} }
} }

View File

@ -0,0 +1,4 @@
angelina=black,ROLE_ADMIN
brad=grey,ROLE_TELLER,ROLE_PERMISSION_LIST
paris=pink,ROLE_TELLER
bono=sunny,ROLE_PERMISSION_LIST

View File

@ -553,20 +553,24 @@
<xsd:element name="configuration-attribute" <xsd:element name="configuration-attribute"
type="ConfigurationAttributeType" /> type="ConfigurationAttributeType" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="path" type="xsd:string" use="optional"/> <xsd:attribute name="path" type="xsd:string" use="optional" />
<xsd:attribute name="regularExpression" type="xsd:string" use="optional"/> <xsd:attribute name="regularExpression" type="xsd:string"
use="optional" />
</xsd:complexType> </xsd:complexType>
<xsd:complexType name="ConfigurationAttributeType"> <xsd:complexType name="ConfigurationAttributeType">
<xsd:attribute name="attribute" type="xsd:string" /> <xsd:attribute name="attribute" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
<xsd:element name="authorization-manager" type="AuthorizationManagerType"/> <xsd:element name="authorization-manager"
type="AuthorizationManagerType" />
<xsd:complexType name="AuthorizationManagerType"> <xsd:complexType name="AuthorizationManagerType">
<xsd:sequence> <xsd:sequence>
<xsd:element name="role-voter" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="role-voter" type="xsd:string"
<xsd:element name="authenticated-voter" type="xsd:string" minOccurs="0" maxOccurs="1"/> minOccurs="0" maxOccurs="1" />
<xsd:element name="authenticated-voter" type="xsd:string"
minOccurs="0" maxOccurs="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="id" type="xsd:ID"> <xsd:attribute name="id" type="xsd:ID">
<xsd:annotation> <xsd:annotation>
@ -577,7 +581,65 @@
</xsd:documentation> </xsd:documentation>
</xsd:annotation> </xsd:annotation>
</xsd:attribute> </xsd:attribute>
<xsd:attribute name="strategy" type="response" default="affirmative"/> <xsd:attribute name="strategy" type="response"
default="affirmative" />
</xsd:complexType>
<!-- Authorization JointPoint -->
<xsd:element name="authorization-joinpoint"
type="AuthorizationJointPointType">
<xsd:annotation>
<xsd:documentation>
<![CDATA[
]]>
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:complexType name="AuthorizationJointPointType">
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element name="url-mapping"
type="JointPointMappingType">
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:ID">
<xsd:annotation>
<xsd:documentation>
<![CDATA[
The unique identifier for a bean.
]]>
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="springAop" type="xsd:boolean"
use="optional" />
<xsd:attribute name="aspectj" type="xsd:boolean" use="optional" />
</xsd:complexType>
<xsd:complexType name="JointPointMappingType">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="method-pattern" type="MethodPatternType" />
</xsd:sequence>
<xsd:attribute name="source" type="MethodInterceptorType"
default="xml" />
<xsd:attribute name="sourceBeanId" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
<![CDATA[
Reference to an external ObjectDefinitionSource.
]]>
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
<xsd:complexType name="MethodPatternType">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="configuration-attribute"
type="ConfigurationAttributeType" />
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
<xsd:simpleType name="response"> <xsd:simpleType name="response">
@ -588,6 +650,15 @@
</xsd:restriction> </xsd:restriction>
</xsd:simpleType> </xsd:simpleType>
<xsd:simpleType name="MethodInterceptorType">
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="xml" />
<xsd:enumeration value="attributes" />
<xsd:enumeration value="annotations" />
<xsd:enumeration value="custom" />
</xsd:restriction>
</xsd:simpleType>
<!-- simple internal types --> <!-- simple internal types -->
<xsd:simpleType name="defaultable-boolean"> <xsd:simpleType name="defaultable-boolean">
<xsd:restriction base="xsd:NMTOKEN"> <xsd:restriction base="xsd:NMTOKEN">

View File

@ -1,4 +1,4 @@
package org.acegisecurity.config; package org.acegisecurity.config;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -9,13 +9,14 @@ import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.memory.InMemoryDaoImpl; import org.acegisecurity.userdetails.memory.InMemoryDaoImpl;
import org.acegisecurity.userdetails.memory.UserMap; import org.acegisecurity.userdetails.memory.UserMap;
import org.springframework.beans.PropertyValue; import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
/** /**
* @author vpuri * @author Vishal Puri
* *
*/ */
public class PrincipalRepositoryNamespaceTests extends TestCase { public class PrincipalRepositoryNamespaceTests extends TestCase {
@ -60,4 +61,5 @@ public class PrincipalRepositoryNamespaceTests extends TestCase {
assertEquals(new GrantedAuthorityImpl("ROLE_YO"), users.getUser("vishal").getAuthorities()[0]); assertEquals(new GrantedAuthorityImpl("ROLE_YO"), users.getUser("vishal").getAuthorities()[0]);
assertEquals(new GrantedAuthorityImpl("ROLE_YOYO"), users.getUser("vishal").getAuthorities()[1]); assertEquals(new GrantedAuthorityImpl("ROLE_YOYO"), users.getUser("vishal").getAuthorities()[1]);
} }
} }

View File

@ -12,9 +12,7 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
<import resource="remember-me-defaults.xml" /> <import resource="remember-me-defaults.xml" />
<security:authorization-http-url id="authorizationhttp"> <security:authorization-http-url id="authorizationhttp">
<security:url-mapping <security:url-mapping source="xml">
source="xml - the default and no other options"
sourceBeanId="referenceToTheirObjectDefinitionSource">
<!-- Specify security:uri-patterns in order of processing; each pattern must specify EITHER a <!-- Specify security:uri-patterns in order of processing; each pattern must specify EITHER a
regularExpression OR a path, but not both and ALL patterns in the url-mapping MUST be of the regularExpression OR a path, but not both and ALL patterns in the url-mapping MUST be of the
SAME type (ie cannot mix a regular expression and Ant Path) - give exception if tried --> SAME type (ie cannot mix a regular expression and Ant Path) - give exception if tried -->
@ -22,8 +20,7 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
<security:configuration-attribute attribute="ROLE_A" /> <security:configuration-attribute attribute="ROLE_A" />
<security:configuration-attribute attribute="ROLE_B" /> <security:configuration-attribute attribute="ROLE_B" />
</security:uri-pattern> </security:uri-pattern>
<security:uri-pattern <security:uri-pattern regularExpression="whatever">
regularExpression="whatever">
<security:configuration-attribute attribute="ROLE_A" /> <security:configuration-attribute attribute="ROLE_A" />
</security:uri-pattern> </security:uri-pattern>
</security:url-mapping> </security:url-mapping>

View File

@ -0,0 +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:security="http://www.springframework.org/schema/security"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/beans/spring-util-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
<!-- http://www.springframework.org/schema/security file:/Users/vpuri/interface21/acegisecurity/trunk/acegisecurity/core/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd -->
<!-- http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd" -->
<!--
the source refers to use of the relevant concete ObjectDefinitionSource;
user can alternately specify their own instance and refer to it
via the sourceBeanId property; in that case they must specify "custom";
if unspecified, it means it's described as nested elements using the
security:method-pattern element, and you will therefore create it via
the MethodDefinitionSourceEditor (that is what the default source=xml means, too)
For aspectj and springAop, that means create a MethodSecurityInterceptor and
AspectJSecurityInterceptor bean definition respectively (in the case of
springAop, also create a MethodDefinitionSourceAdvisor); defaults to
springAop=true, aspectJ=false
-->
<import resource="remember-me-defaults.xml" />
<import resource="authorization-manager.xml"/>
<security:authorization-joinpoint id="methodInterceptor"
springAop="true" >
<security:url-mapping source="annotations">
<security:method-pattern
type="org.acegisecurity.BankServiceImpl.listAccounts">
<security:configuration-attribute attribute="ROLE_A" />
<security:configuration-attribute attribute="ROLE_B" />
</security:method-pattern>
</security:url-mapping>
</security:authorization-joinpoint>
</beans>

View File

@ -0,0 +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:security="http://www.springframework.org/schema/security"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/beans/spring-util-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
<!-- http://www.springframework.org/schema/security file:/Users/vpuri/interface21/acegisecurity/trunk/acegisecurity/core/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd -->
<!-- http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd" -->
<!--
the source refers to use of the relevant concete ObjectDefinitionSource;
user can alternately specify their own instance and refer to it
via the sourceBeanId property; in that case they must specify "custom";
if unspecified, it means it's described as nested elements using the
security:method-pattern element, and you will therefore create it via
the MethodDefinitionSourceEditor (that is what the default source=xml means, too)
For aspectj and springAop, that means create a MethodSecurityInterceptor and
AspectJSecurityInterceptor bean definition respectively (in the case of
springAop, also create a MethodDefinitionSourceAdvisor); defaults to
springAop=true, aspectJ=false
-->
<import resource="remember-me-defaults.xml" />
<import resource="authorization-manager.xml"/>
<security:authorization-joinpoint id="methodInterceptor"
aspectj="true" >
<security:url-mapping source="annotations">
<security:method-pattern
type="org.acegisecurity.BankServiceImpl.listAccounts">
<security:configuration-attribute attribute="ROLE_A" />
<security:configuration-attribute attribute="ROLE_B" />
</security:method-pattern>
</security:url-mapping>
</security:authorization-joinpoint>
</beans>

View File

@ -0,0 +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:security="http://www.springframework.org/schema/security"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/beans/spring-util-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
<!-- http://www.springframework.org/schema/security file:/Users/vpuri/interface21/acegisecurity/trunk/acegisecurity/core/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd -->
<!-- http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd" -->
<!--
the source refers to use of the relevant concete ObjectDefinitionSource;
user can alternately specify their own instance and refer to it
via the sourceBeanId property; in that case they must specify "custom";
if unspecified, it means it's described as nested elements using the
security:method-pattern element, and you will therefore create it via
the MethodDefinitionSourceEditor (that is what the default source=xml means, too)
For aspectj and springAop, that means create a MethodSecurityInterceptor and
AspectJSecurityInterceptor bean definition respectively (in the case of
springAop, also create a MethodDefinitionSourceAdvisor); defaults to
springAop=true, aspectJ=false
-->
<import resource="remember-me-defaults.xml" />
<import resource="authorization-manager.xml"/>
<security:authorization-joinpoint id="methodInterceptor"
springAop="true" >
<security:url-mapping source="attributes">
<security:method-pattern
type="org.acegisecurity.BankServiceImpl.listAccounts">
<security:configuration-attribute attribute="ROLE_A" />
<security:configuration-attribute attribute="ROLE_B" />
</security:method-pattern>
</security:url-mapping>
</security:authorization-joinpoint>
</beans>

View File

@ -0,0 +1,56 @@
<?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:security="http://www.springframework.org/schema/security"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/beans/spring-util-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
<!-- http://www.springframework.org/schema/security file:/Users/vpuri/interface21/acegisecurity/trunk/acegisecurity/core/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd -->
<!-- http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd" -->
<!--
the source refers to use of the relevant concete ObjectDefinitionSource;
user can alternately specify their own instance and refer to it
via the sourceBeanId property; in that case they must specify "custom";
if unspecified, it means it's described as nested elements using the
security:method-pattern element, and you will therefore create it via
the MethodDefinitionSourceEditor (that is what the default source=xml means, too)
For aspectj and springAop, that means create a MethodSecurityInterceptor and
AspectJSecurityInterceptor bean definition respectively (in the case of
springAop, also create a MethodDefinitionSourceAdvisor); defaults to
springAop=true, aspectJ=false
-->
<import resource="remember-me-defaults.xml" />
<import resource="authorization-manager.xml"/>
<security:authorization-joinpoint id="methodInterceptor"
springAop="true" >
<security:url-mapping source="xml">
<security:method-pattern
type="org.acegisecurity.BankServiceImpl.listAccounts">
<security:configuration-attribute attribute="ROLE_A" />
</security:method-pattern>
</security:url-mapping>
</security:authorization-joinpoint>
<!--
<bean id="methodSecurity" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="validateConfigAttributes"><value>true</value></property>
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
<property name="accessDecisionManager"><ref bean="accessDecisionManager"/></property>
<property name="runAsManager"><ref bean="runAsManager"/></property>
<property name="afterInvocationManager"><ref bean="afterInvocationManager"/></property>
<property name="objectDefinitionSource">
<value>
org.acegisecurity.context.BankManager.delete*=ROLE_SUPERVISOR,RUN_AS_SERVER
org.acegisecurity.context.BankManager.getBalance=ROLE_TELLER,ROLE_SUPERVISOR,BANKSECURITY_CUSTOMER,RUN_AS_SERVER
</value>
</property>
</bean>
-->
</beans>