[java-identity-provider] branch maint-4 updated: JSATTR-4 Remove springResources from data connector
Rod Widdowson
rdw at steadingsoftware.com
Tue Oct 25 13:59:05 UTC 2022
This is an automated email from the git hooks/post-receive script.
rdw pushed a commit to branch maint-4
in repository java-identity-provider.
View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=0af0470f2f1d305722e5ac4d56be7f96395f0898
The following commit(s) were added to refs/heads/maint-4 by this push:
new 0af0470f2 JSATTR-4 Remove springResources from data connector
0af0470f2 is described below
commit 0af0470f2f1d305722e5ac4d56be7f96395f0898
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Tue Oct 25 14:57:17 2022 +0100
JSATTR-4 Remove springResources from data connector
https://shibboleth.atlassian.net/browse/JSATTR-4
Add 'connectionFactoryRef="bean"' and 'searchExecutorRef="bean"'
to the LDAP data connector.
---
.../dc/ldap/impl/LDAPDataConnectorParser.java | 78 +++++++++++++++++-----
.../dc/ldap/LDAPDataConnectorParserTest.java | 17 ++++-
.../ldap/resolver/ldap-attribute-resolver-ref.xml | 20 ++++++
.../spring/dc/ldap/resolver/ldap-ref-beans.xml | 66 ++++++++++++++++++
.../schema/shibboleth-attribute-resolver.xsd | 20 ++++--
5 files changed, 181 insertions(+), 20 deletions(-)
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
index 691e4af1d..9dc500f24 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
@@ -147,10 +147,6 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
final V2Parser v2Parser = new V2Parser(config, getLogPrefix());
- final BeanDefinitionBuilder connectionFactory =
- BeanDefinitionBuilder.genericBeanDefinition(DefaultConnectionFactory.class);
- connectionFactory.addConstructorArgValue(v2Parser.createConnectionConfig(parserContext));
-
final String searchBuilderID = v2Parser.getBeanSearchBuilderID();
if (searchBuilderID != null) {
builder.addPropertyReference("executableSearchBuilder", searchBuilderID);
@@ -161,19 +157,34 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
}
}
- final BeanDefinition connectionPool = v2Parser.createConnectionPool(connectionFactory.getBeanDefinition());
+ final String connectionFactoryID = v2Parser.getBeanConnectionFactoryID();
BeanDefinitionBuilder pooledConnectionFactory = null;
- if (connectionPool != null) {
- pooledConnectionFactory = BeanDefinitionBuilder.genericBeanDefinition(PooledConnectionFactory.class);
- pooledConnectionFactory.addConstructorArgValue(connectionPool);
- builder.addPropertyValue("connectionFactory", pooledConnectionFactory.getBeanDefinition());
+ BeanDefinitionBuilder connectionFactory = null;
+ if (connectionFactoryID != null) {
+ builder.addPropertyReference("connectionFactory", connectionFactoryID);
} else {
- builder.addPropertyValue("connectionFactory", connectionFactory.getBeanDefinition());
+ connectionFactory =
+ BeanDefinitionBuilder.genericBeanDefinition(DefaultConnectionFactory.class);
+ connectionFactory.addConstructorArgValue(v2Parser.createConnectionConfig(parserContext));
+
+ final BeanDefinition connectionPool = v2Parser.createConnectionPool(connectionFactory.getBeanDefinition());
+ if (connectionPool != null) {
+ pooledConnectionFactory = BeanDefinitionBuilder.genericBeanDefinition(PooledConnectionFactory.class);
+ pooledConnectionFactory.addConstructorArgValue(connectionPool);
+ builder.addPropertyValue("connectionFactory", pooledConnectionFactory.getBeanDefinition());
+ } else {
+ builder.addPropertyValue("connectionFactory", connectionFactory.getBeanDefinition());
+ }
}
- final BeanDefinition searchExecutor = v2Parser.createSearchExecutor();
- builder.addPropertyValue("searchExecutor", searchExecutor);
-
+ final String searchExecutorID = v2Parser.getBeanSearchExecutorID();
+ if (searchExecutorID!= null) {
+ builder.addPropertyReference("searchExecutor", searchExecutorID);
+ } else {
+ final BeanDefinition searchExecutor = v2Parser.createSearchExecutor();
+ builder.addPropertyValue("searchExecutor", searchExecutor);
+ }
+
final String mappingStrategyID = AttributeSupport.getAttributeValue(config, new QName("mappingStrategyRef"));
if (mappingStrategyID != null) {
builder.addPropertyReference("mappingStrategy", mappingStrategyID);
@@ -188,7 +199,10 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
if (validatorID != null) {
builder.addPropertyReference("validator", validatorID);
} else {
- if (pooledConnectionFactory != null) {
+ if (connectionFactoryID != null) {
+ builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactoryID));
+ }
+ else if (pooledConnectionFactory != null) {
builder.addPropertyValue("validator",
v2Parser.createValidator(pooledConnectionFactory.getBeanDefinition()));
} else {
@@ -436,13 +450,31 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
/**
* Get the bean ID of an externally defined search builder.
- *
+ *
* @return search builder bean ID
*/
@Nullable public String getBeanSearchBuilderID() {
return AttributeSupport.getAttributeValue(configElement, null, "executableSearchBuilderRef");
}
+ /**
+ * Get the bean ID of an externally defined Connection Factory
+ *
+ * @return Connection Factory bean ID
+ */
+ @Nullable public String getBeanConnectionFactoryID() {
+ return AttributeSupport.getAttributeValue(configElement, null, "connectionFactoryRef");
+ }
+
+ /**
+ * Get the bean ID of an externally defined Search Executor
+ *
+ * @return Search Executor bean ID
+ */
+ @Nullable public String getBeanSearchExecutorID() {
+ return AttributeSupport.getAttributeValue(configElement, null, "searchExecutorRef");
+ }
+
/**
* Construct the definition of the template driven search builder.
*
@@ -816,6 +848,22 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
return validator.getBeanDefinition();
}
+ /**
+ * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
+ *
+ * @param connectionFactoryId reference to provide to the validator
+ *
+ * @return validator
+ */
+ @Nullable public BeanDefinition createValidator(final String connectionFactoryId) {
+
+ final BeanDefinitionBuilder validator =
+ BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
+
+ validator.addPropertyReference("connectionFactory", connectionFactoryId);
+ return validator.getBeanDefinition();
+ }
+
/**
* Create a results cache bean definition. See {@link CacheConfigParser}.
*
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
index 15fdba39c..a078ffe45 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
@@ -38,7 +38,6 @@ import org.ldaptive.BindConnectionInitializer;
import org.ldaptive.ConnectionConfig;
import org.ldaptive.DefaultConnectionFactory;
import org.ldaptive.RandomConnectionStrategy;
-import org.ldaptive.RoundRobinConnectionStrategy;
import org.ldaptive.SearchExecutor;
import org.ldaptive.pool.BlockingConnectionPool;
import org.ldaptive.pool.IdlePruneStrategy;
@@ -485,6 +484,22 @@ public class LDAPDataConnectorParserTest {
assertNotNull(attrs);
}
+ @Test public void refConfig() throws Exception {
+ final LDAPDataConnector dataConnector =
+ getLdapDataConnector(new String[] {"net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml",
+ "net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml"});
+ assertNotNull(dataConnector);
+ doTest(dataConnector);
+
+ dataConnector.initialize();
+ final AttributeResolutionContext context =
+ TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
+ TestSources.SP_ENTITY_ID);
+ final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
+ assertNotNull(attrs);
+ }
+
+
@Test public void springPropsConfig() throws Exception,
ResolutionException {
final Resource props = new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-v3.properties");
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml
new file mode 100644
index 000000000..f88097249
--- /dev/null
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-ref.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="urn:mace:shibboleth:2.0:security"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd
+ urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+
+ <DataConnector id="myLDAP" xsi:type="LDAPDirectory"
+ executableSearchBuilderRef="LDAPTSearchBuilder"
+ noRetryDelay="PT5M"
+ mappingStrategyRef="LDAPTESTmappings"
+ connectionFactoryRef="LDAPTESTconnectionFactory"
+ searchExecutorRef="LDAPTESTsearchExecutor"
+ validatorRef="LDAPTESTvalidator">
+
+ <FailoverDataConnector ref="2123"/>
+
+ <ResultCache cacheManagerRef="LDAPTESTcache"/>
+
+ </DataConnector>
+
+</AttributeResolver>
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
new file mode 100644
index 000000000..00af4a8eb
--- /dev/null
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
@@ -0,0 +1,66 @@
+<?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:p="http://www.springframework.org/schema/p"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
+ <bean id="LDAPTESTconnectionFactory" class="org.ldaptive.pool.PooledConnectionFactory">
+ <property name="connectionPool">
+ <bean class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:blockWaitTime="PT5S" p:failFastInitialize="false" p:name="resolver-pool">
+ <constructor-arg index="0">
+ <bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="5" p:maxPoolSize="10"
+ p:validatePeriodically="true" p:validatePeriod="PT15M" />
+ </constructor-arg>
+ <constructor-arg index="1">
+ <bean class="org.ldaptive.DefaultConnectionFactory">
+ <property name="connectionConfig">
+ <bean class="org.ldaptive.ConnectionConfig" p:ldapUrl="ldap://localhost:10389"
+ p:useStartTLS="true" p:connectTimeout="PT2S" p:responseTimeout="PT4S">
+ <property name="connectionInitializer">
+ <bean class="org.ldaptive.BindConnectionInitializer" p:bindDn="cn=Directory Manager"
+ p:bindCredential="password" />
+ </property>
+ <property name="sslConfig">
+ <bean class="org.ldaptive.ssl.SslConfig">
+ <property name="credentialConfig">
+ <bean class="org.ldaptive.ssl.X509CredentialConfig"
+ p:trustCertificates="file:src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/server.crt"
+ p:authenticationCertificate="file:src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/client.crt"
+ p:authenticationKey="file:src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/client.pkcs8" />
+ </property>
+ </bean>
+ </property>
+ </bean>
+ </property>
+ </bean>
+ </constructor-arg>
+ <property name="validator">
+ <bean class="org.ldaptive.pool.SearchValidator">
+ <property name="searchRequest">
+ <bean class="org.ldaptive.SearchRequest">
+ <constructor-arg value="dc=shibboleth,dc=net" />
+ <constructor-arg value="(ou=people)" />
+ </bean>
+ </property>
+ </bean>
+ </property>
+ <property name="pruneStrategy">
+ <bean class="org.ldaptive.pool.IdlePruneStrategy" p:prunePeriod="PT5M" p:idleTime="PT10M" />
+ </property>
+ </bean>
+ </property>
+ </bean>
+ <bean id="LDAPTESTsearchExecutor" class="org.ldaptive.SearchExecutor" p:baseDn="ou=people,dc=shibboleth,dc=net" p:returnAttributes="uid,homephone,mail" p:timeLimit="PT7S" />
+ <bean id="LDAPTESTcache" class="com.google.common.cache.Cache" factory-bean="cacheBuilderExternal" factory-method="build" />
+ <bean id="LDAPTSearchBuilder" class="net.shibboleth.idp.attribute.resolver.dc.ldap.TemplatedExecutableSearchFilterBuilder"
+ p:templateText="(uid=${resolutionContext.principal})" p:velocityEngine-ref="shibboleth.VelocityEngine"
+ init-method="initialize" />
+ <bean id="LDAPTESTmappings" class="net.shibboleth.idp.attribute.resolver.dc.ldap.StringAttributeValueMappingStrategy"
+ p:noResultAnError="true" p:multipleResultsAnError="true">
+ <property name="resultRenamingMap">
+ <map>
+ <entry key="homephone" value="phonenumber" />
+ </map>
+ </property>
+ </bean>
+ <bean id="LDAPTESTvalidator" class="net.shibboleth.idp.attribute.resolver.dc.ldap.impl.ConnectionFactoryValidator"
+ p:connectionFactory-ref="LDAPTESTconnectionFactory" p:throwValidateError="true" />
+</beans>
\ No newline at end of file
diff --git a/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd b/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
index 5341fd526..7a83c8e3b 100644
--- a/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
+++ b/idp-schema/src/main/resources/schema/shibboleth-attribute-resolver.xsd
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema"
- xmlns:resolver="urn:mace:shibboleth:2.0:resolver"
- xmlns:sec="urn:mace:shibboleth:2.0:security"
- targetNamespace="urn:mace:shibboleth:2.0:resolver"
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:resolver="urn:mace:shibboleth:2.0:resolver"
+ xmlns:sec="urn:mace:shibboleth:2.0:security" targetNamespace="urn:mace:shibboleth:2.0:resolver"
elementFormDefault="qualified" version="4.3">
<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
@@ -1060,6 +1058,20 @@
</documentation>
</annotation>
</attribute>
+ <attribute name="connectionFactoryRef" type="resolver:string">
+ <annotation>
+ <documentation>
+ Reference to a Spring bean providing the Connection Factory implementation to use.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="searchExecutorRef" type="resolver:string">
+ <annotation>
+ <documentation>
+ Reference to a Spring bean providing the Search Executor implementation to use.
+ </documentation>
+ </annotation>
+ </attribute>
<attribute name="validatorRef" type="resolver:string">
<annotation>
<documentation>
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list