@ -13,7 +13,13 @@
@@ -13,7 +13,13 @@
* limitations under the License .
* /
package org.acegisecurity.config ;
import org.acegisecurity.ldap.DefaultInitialDirContextFactory ;
import org.acegisecurity.providers.ProviderManager ;
import org.acegisecurity.providers.ldap.LdapAuthenticationProvider ;
import org.acegisecurity.providers.ldap.authenticator.BindAuthenticator ;
import org.acegisecurity.providers.ldap.populator.DefaultLdapAuthoritiesPopulator ;
import org.acegisecurity.util.BeanDefinitionParserUtils ;
import org.springframework.beans.factory.config.RuntimeBeanReference ;
import org.springframework.beans.factory.support.AbstractBeanDefinition ;
import org.springframework.beans.factory.support.ManagedList ;
@ -23,14 +29,15 @@ import org.springframework.beans.factory.xml.BeanDefinitionParser;
@@ -23,14 +29,15 @@ import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext ;
import org.springframework.util.Assert ;
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 ;
/ * *
* * { @link BeanDefinitionParser } for the < code > authentication - mechanism < / code > tag ,
* resolves to { @link org . acegisecurity . providers . ProviderManager } < / br >
* * { @link BeanDefinitionParser } for the < code > authentication - mechanism < / code >
* tag , resolves to { @link org . acegisecurity . providers . ProviderManager } < / br >
*
* @author vpuri
* @see { @link org . springframework . beans . factory . BeanFactory }
* @see { @link org . acegisecurity . providers . ProviderManager }
@ -43,6 +50,8 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
@@ -43,6 +50,8 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
private static final String AUTHENTICATION_JDBC = "authentication-jdbc" ;
private static final String AUTHENTICATION_LDAP = "authentication-ldap" ;
private static final String REF = "ref" ;
// ~ Methods
@ -59,7 +68,7 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
@@ -59,7 +68,7 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
if ( node . getNodeType ( ) = = Node . ELEMENT_NODE ) {
Element childElement = ( Element ) node ;
//this.providerExists = true;
// this.providerExists = true;
if ( AUTHENTICATION_JDBC . equals ( node . getLocalName ( ) ) ) {
String attribute = childElement . getAttribute ( REF ) ;
@ -67,15 +76,16 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
@@ -67,15 +76,16 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
// create a beandefinition
providers . add ( new RuntimeBeanReference ( attribute ) ) ;
}
} else if ( AUTHENTICATION_LDAP . equals ( node . getLocalName ( ) ) ) {
providers . add ( createLdapAuthencticationProviderBeanDefinition ( childElement , parserContext ) ) ;
}
// TODO:Add other providers here
}
authMechanismBeanDef . getPropertyValues ( ) . addPropertyValue ( "providers" , providers ) ;
}
return authMechanismBeanDef ;
}
/ * *
* Creates a default bean definition .
* @return
@ -83,7 +93,8 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
@@ -83,7 +93,8 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
protected static RootBeanDefinition createAndRegisterBeanDefinitionWithDefaults ( ParserContext parserContext ) {
RootBeanDefinition beanDefinition = new RootBeanDefinition ( ProviderManager . class ) ;
ManagedList providers = new ManagedList ( ) ;
// create authentication-repository (DaoAuthenticationProvider) and add that to list
// create authentication-repository (DaoAuthenticationProvider) and add
// that to list
RootBeanDefinition authRepo = AuthenticationRepositoryBeanDefinitionParser . createBeanDefinitionWithDefaults ( ) ;
providers . add ( authRepo ) ;
beanDefinition . getPropertyValues ( ) . addPropertyValue ( "providers" , providers ) ;
@ -91,4 +102,42 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
@@ -91,4 +102,42 @@ public class AuthenticationMechanismBeanDefinitionParser extends AbstractBeanDef
return beanDefinition ;
}
protected static RootBeanDefinition createLdapAuthencticationProviderBeanDefinition ( Element element ,
ParserContext parserContext ) {
// element ldap
RootBeanDefinition ldapAuthProvider = new RootBeanDefinition ( LdapAuthenticationProvider . class ) ;
RootBeanDefinition initialDirContextFactory = createInitialDirContextFactoryBeanDefinition ( element ) ;
RootBeanDefinition ldapAuthoritiesPopulator = new RootBeanDefinition ( DefaultLdapAuthoritiesPopulator . class ) ;
RootBeanDefinition bindAuthenticator = new RootBeanDefinition ( BindAuthenticator . class ) ;
Element property = DomUtils . getChildElementByTagName ( element , "property" ) ;
Assert . notNull ( property ) ;
parserContext . getDelegate ( ) . parsePropertyElement ( property , bindAuthenticator ) ;
bindAuthenticator . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 0 , initialDirContextFactory ) ;
// LdapAuthenticator
ldapAuthProvider . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 0 , bindAuthenticator ) ;
ldapAuthoritiesPopulator . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 0 , initialDirContextFactory ) ;
BeanDefinitionParserUtils . setConstructorArgumentIfAvailable ( 1 , element , "groupSearchBase" , false ,
ldapAuthoritiesPopulator ) ;
BeanDefinitionParserUtils . setPropertyIfAvailable ( element , "groupRoleAttribute" , "groupRoleAttribute" , ldapAuthoritiesPopulator ) ;
//LdapAuthoritiesPopulator
ldapAuthProvider . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 1 , ldapAuthoritiesPopulator ) ;
return ldapAuthProvider ;
}
private static RootBeanDefinition createInitialDirContextFactoryBeanDefinition ( Element element ) {
RootBeanDefinition initialDirContextFactory = new RootBeanDefinition ( DefaultInitialDirContextFactory . class ) ;
BeanDefinitionParserUtils . setConstructorArgumentIfAvailable ( 0 , element , "ldapUrl" , false ,
initialDirContextFactory ) ;
BeanDefinitionParserUtils . setPropertyIfAvailable ( element , "managerDn" , "managerDn" , initialDirContextFactory ) ;
BeanDefinitionParserUtils . setPropertyIfAvailable ( element , "managerPassword" , "managerPassword" ,
initialDirContextFactory ) ;
return initialDirContextFactory ;
}
}