Browse Source

SEC-850: custom-authentication-provider Registering Separate Bean Definitions in App Context and Providers List
http://jira.springframework.org/browse/SEC-850. Changed bean decorator to add a bean reference to the ProviderManager rather than a bean definition.

Luke Taylor 17 years ago
parent
commit
d1005e4cfb

+ 2 - 1
core/src/main/java/org/springframework/security/config/CustomAuthenticationProviderBeanDefinitionDecorator.java

@@ -3,6 +3,7 @@ package org.springframework.security.config;
 import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.springframework.beans.factory.config.BeanDefinitionHolder;
+import org.springframework.beans.factory.config.RuntimeBeanReference;
 
 import org.w3c.dom.Node;
 
@@ -16,7 +17,7 @@ import org.w3c.dom.Node;
  */
 public class CustomAuthenticationProviderBeanDefinitionDecorator implements BeanDefinitionDecorator {
     public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder holder, ParserContext parserContext) {
-        ConfigUtils.getRegisteredProviders(parserContext).add(holder.getBeanDefinition());
+        ConfigUtils.getRegisteredProviders(parserContext).add(new RuntimeBeanReference(holder.getBeanName()));
 
         return holder;
     }

+ 18 - 7
core/src/test/java/org/springframework/security/config/CustomAuthenticationProviderBeanDefinitionDecoratorTests.java

@@ -1,21 +1,32 @@
 package org.springframework.security.config;
 
+import static org.junit.Assert.*;
+
 import org.junit.Test;
+import org.springframework.security.providers.ProviderManager;
 import org.springframework.security.util.InMemoryXmlApplicationContext;
 
 
 public class CustomAuthenticationProviderBeanDefinitionDecoratorTests {
     
     @Test
-    public void decoratorParsesSuccessfully() {
+    public void decoratedProviderParsesSuccessfully() {
         InMemoryXmlApplicationContext ctx = new InMemoryXmlApplicationContext(
-                "<b:bean id='someBean' class='org.springframework.security.config.TestBusinessBeanImpl'>" +
-                "   <intercept-methods>" +
-                "       <protect method='org.springframework.security.config.TestBusinessBean.*' access='ROLE_A' />" +
-                "   </intercept-methods>" +
-                "</b:bean>" + HttpSecurityBeanDefinitionParserTests.AUTH_PROVIDER_XML
+                "<b:bean id='myProvider' class='org.springframework.security.providers.dao.DaoAuthenticationProvider'>" +
+                "  <custom-authentication-provider />" +
+                "  <b:property name='userDetailsService' ref='us'/>" +
+                "</b:bean>" + 
+                "<user-service id='us'>" +
+                " <user name='bob' password='bobspassword' authorities='ROLE_A,ROLE_B' />" +
+                " <user name='bill' password='billspassword' authorities='ROLE_A,ROLE_B,AUTH_OTHER' />" +
+                "</user-service>"
+                
         );
         
-        ctx.getBean("someBean");
+        Object myProvider = ctx.getBean("myProvider");
+        
+        ProviderManager authMgr = (ProviderManager) ctx.getBean(BeanIds.AUTHENTICATION_MANAGER);
+        
+        assertSame(myProvider, authMgr.getProviders().get(0));
     }
 }