3 changed files with 136 additions and 0 deletions
@ -0,0 +1,84 @@
@@ -0,0 +1,84 @@
|
||||
package org.acegisecurity.config; |
||||
|
||||
import org.acegisecurity.AccessDecisionManager; |
||||
import org.acegisecurity.vote.AffirmativeBased; |
||||
import org.acegisecurity.vote.AuthenticatedVoter; |
||||
import org.acegisecurity.vote.ConsensusBased; |
||||
import org.acegisecurity.vote.RoleVoter; |
||||
import org.acegisecurity.vote.UnanimousBased; |
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition; |
||||
import org.springframework.beans.factory.support.ManagedList; |
||||
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.util.StringUtils; |
||||
import org.springframework.util.xml.DomUtils; |
||||
import org.w3c.dom.Element; |
||||
import org.w3c.dom.Node; |
||||
import org.w3c.dom.NodeList; |
||||
|
||||
public class AuthorizationManagerBeanDefinitionParser extends AbstractBeanDefinitionParser implements |
||||
BeanDefinitionParser { |
||||
// ~ static initializers
|
||||
// ================================================================================================
|
||||
|
||||
public static final String ROLE_VOTER_ELE = "role-voter"; |
||||
|
||||
public static final String AUTHENTICATED_VOTER_ELE = "authenticated-voter"; |
||||
|
||||
public static final String STRATEGY_ATTRIBUTE = "strategy"; |
||||
|
||||
// ~ Method
|
||||
// ================================================================================================
|
||||
|
||||
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { |
||||
return createBeanDefinition(element, parserContext); |
||||
} |
||||
|
||||
private RootBeanDefinition createBeanDefinition(Element element, ParserContext parserContext) { |
||||
ManagedList decisionVoters = new ManagedList(); |
||||
|
||||
Element roleVoterEle = DomUtils.getChildElementByTagName(element, ROLE_VOTER_ELE); |
||||
Element authVoterEle = DomUtils.getChildElementByTagName(element, AUTHENTICATED_VOTER_ELE); |
||||
|
||||
if(roleVoterEle!=null && roleVoterEle.getLocalName().equals(ROLE_VOTER_ELE)) { |
||||
decisionVoters.add(new RootBeanDefinition(RoleVoter.class)); |
||||
} |
||||
if (authVoterEle!=null && authVoterEle.getLocalName().equals(AUTHENTICATED_VOTER_ELE)) { |
||||
decisionVoters.add(new RootBeanDefinition(AuthenticatedVoter.class)); |
||||
} |
||||
|
||||
String strategy = element.getAttribute(STRATEGY_ATTRIBUTE); |
||||
if (StringUtils.hasLength(strategy)) { |
||||
if (strategy.equals("affirmative")) { |
||||
return createAccessDecisionManager(AffirmativeBased.class, decisionVoters); |
||||
} |
||||
else if (strategy.equals("consensus")) { |
||||
return createAccessDecisionManager(ConsensusBased.class, decisionVoters); |
||||
} |
||||
else if (strategy.equals("unanimous")) { |
||||
return createAccessDecisionManager(UnanimousBased.class, decisionVoters); |
||||
} |
||||
} |
||||
else { |
||||
return createAccessDecisionManagerAffirmativeBased(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
protected static RootBeanDefinition createAccessDecisionManagerAffirmativeBased() { |
||||
ManagedList decisionVoters = new ManagedList(); |
||||
decisionVoters.add(new RootBeanDefinition(AuthenticatedVoter.class)); |
||||
decisionVoters.add(new RootBeanDefinition(RoleVoter.class)); |
||||
return createAccessDecisionManager(AffirmativeBased.class, decisionVoters); |
||||
} |
||||
|
||||
protected static RootBeanDefinition createAccessDecisionManager(Class clazz, ManagedList decisionVoters) { |
||||
RootBeanDefinition accessDecisionManager = new RootBeanDefinition(clazz); |
||||
accessDecisionManager.getPropertyValues().addPropertyValue("allowIfAllAbstainDecisions", Boolean.FALSE); |
||||
accessDecisionManager.getPropertyValues().addPropertyValue("decisionVoters", decisionVoters); |
||||
return accessDecisionManager; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
|
||||
package org.acegisecurity.config; |
||||
|
||||
import java.util.List; |
||||
|
||||
import junit.framework.TestCase; |
||||
|
||||
import org.acegisecurity.AccessDecisionManager; |
||||
import org.acegisecurity.vote.AuthenticatedVoter; |
||||
import org.springframework.beans.factory.config.BeanDefinition; |
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
||||
import org.springframework.beans.factory.support.ManagedList; |
||||
import org.springframework.beans.factory.support.RootBeanDefinition; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.support.ClassPathXmlApplicationContext; |
||||
|
||||
public class AuthorizationManagerBeanDefinitionParserTests extends TestCase { |
||||
|
||||
public void testParsingBeanDefinition() { |
||||
ApplicationContext context = new ClassPathXmlApplicationContext( |
||||
"org/acegisecurity/config/authorization-manager.xml"); |
||||
ConfigurableListableBeanFactory bf = (ConfigurableListableBeanFactory) context.getAutowireCapableBeanFactory(); |
||||
String[] beanNames = bf.getBeanNamesForType(AccessDecisionManager.class); |
||||
assertEquals(1, beanNames.length); |
||||
BeanDefinition def = (RootBeanDefinition) bf.getBeanDefinition(beanNames[0]); |
||||
assertNotNull(def); |
||||
List decisionVoters = (ManagedList) def.getPropertyValues().getPropertyValue("decisionVoters").getValue(); |
||||
assertEquals(2, decisionVoters.size()); |
||||
assertEquals("org.acegisecurity.vote.RoleVoter", ((BeanDefinition) decisionVoters.get(0)).getBeanClassName()); |
||||
assertEquals("org.acegisecurity.vote.AuthenticatedVoter", ((BeanDefinition) decisionVoters.get(1)).getBeanClassName()); |
||||
} |
||||
} |
||||
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
<?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" |
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd |
||||
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"> |
||||
|
||||
|
||||
<!-- |
||||
creates a bean definition for an AccessDecisionManager; strategy defaults to |
||||
AffirmativeBased; superclass AbstractAccessDecisionManager requires refactoring |
||||
so if no setProvider(List) given, it introspects app ctx for all AccessDecisionVoters |
||||
and uses their Ordered interface to apply them; if one doesn't implement Ordered, |
||||
assume it is Integer.MAX_VALUE |
||||
--> |
||||
<security:authorization-manager id="id" strategy="affirmative"> |
||||
<security:role-voter /> |
||||
<security:authenticated-voter /> |
||||
</security:authorization-manager> |
||||
</beans> |
||||
Loading…
Reference in new issue