无法连接到 Spring 引导应用程序中的 Active Directory,并显示“'userDn' 未设置”消息
Unable to connect to Active Directory in Spring Boot application with "'userDn' not set" message
各位。我正在尝试编写一个与 Active Directory 服务器一起工作的 Spring 引导程序(用于修改,而不是身份验证),但我无法让该程序连接到它。无论我做什么,它都会显示以下消息:
o.s.l.c.support.AbstractContextSource : Property 'userDn' not set - anonymous context will be used for read-write operations
这是错误的,因为 AD 服务器不接受匿名连接。
这是我的完整 build.gradle 文件。
plugins {
id 'org.springframework.boot' version '2.4.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'groovy'
}
group = 'edu.sunyjcc.gateway'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.codehaus.groovy:groovy'
implementation 'org.springframework.boot:spring-boot-starter-data-ldap'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
我在 src\main\resources\applicationContext.xml
中为 mydomainLdapTemplate 定义了一个 bean
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:ldap="http://www.springframework.org/schema/ldap"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/ldap
https://www.springframework.org/schema/ldap/spring-ldap.xsd"
>
<context:property-placeholder location="classpath:ldap.properties"/>
<!-- <ldap:context-source id="mydomainContextSource" -->
<!-- userDn="${ldap.authentication.manager.userdn}" -->
<!-- username="${ldap.authentication.manager.username}" -->
<!-- password="${ldap.authentication.manager.password}" -->
<!-- url="${ldap.authentication.server.urls}" -->
<!-- base="${ldap.authentication.basedn}" /> -->
<bean id="mydomainContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="pooled" value="false"/>
<property name="urls">
<bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
<constructor-arg type="java.lang.String" value="${ldap.authentication.server.urls}"/>
</bean>
</property>
<property name="userDn" value="${ldap.authentication.manager.userdn}"/>
<!-- <property name="username" value="${ldap.authentication.manager.userdn}"/> -->
<!-- <property name="username" value="${ldap.authentication.manager.username}"/> -->
<property name="password" value="${ldap.authentication.manager.password}"/>
<property name="baseEnvironmentProperties">
<map>
<entry key="com.sun.jndi.ldap.connect.timeout" value="${ldap.authentication.jndi.connect.timeout}" />
<entry key="com.sun.jndi.ldap.read.timeout" value="${ldap.authentication.jndi.read.timeout}" />
<entry key="java.naming.security.authentication" value="${ldap.authentication.jndi.security.level}" />
</map>
</property>
</bean>
<ldap:ldap-template id="mydomainLdapTemplate"
ignore-partial-result="true"
context-source-ref="mydomainContextSource"/>
</beans>
我试过在 userdn 和用户名之间切换(在 src\main\resources\ldap.properties
中),但都不起作用。
ldap.authentication.manager.userdn=cn=myacct,dc=mydomain,dc=sunyjcc,dc=edu
ldap.authentication.manager.username=myacct@mydomain.sunyjcc.edu
我也试过在 bean 配置中在用户名和 userDn 之间切换,但似乎没有任何效果。谁能告诉我我做错了什么?
ActiveDirectoryLdapAuthenticationProvider 似乎不是一个选项,因为我不是要验证身份,而是要修改用户记录。
谢谢!
Ed.
嗯,有时候问对问题比得到正确答案更重要。结果是 Spring Boot 不会自动检测 XML 配置,你必须手动检测。通过将 @ImportResource 注释添加到您的主 class,这很容易做到。你改变这个:
@SpringBootApplication
public class GatewayLdapApplication implements CommandLineRunner {
到此。
@SpringBootApplication
@ImportResource(["classpath*:applicationContext.xml"])
public class GatewayLdapApplication implements CommandLineRunner {
现在它连接得很好。
Ed.
各位。我正在尝试编写一个与 Active Directory 服务器一起工作的 Spring 引导程序(用于修改,而不是身份验证),但我无法让该程序连接到它。无论我做什么,它都会显示以下消息:
o.s.l.c.support.AbstractContextSource : Property 'userDn' not set - anonymous context will be used for read-write operations
这是错误的,因为 AD 服务器不接受匿名连接。
这是我的完整 build.gradle 文件。
plugins {
id 'org.springframework.boot' version '2.4.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'groovy'
}
group = 'edu.sunyjcc.gateway'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.codehaus.groovy:groovy'
implementation 'org.springframework.boot:spring-boot-starter-data-ldap'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
我在 src\main\resources\applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:ldap="http://www.springframework.org/schema/ldap"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/ldap
https://www.springframework.org/schema/ldap/spring-ldap.xsd"
>
<context:property-placeholder location="classpath:ldap.properties"/>
<!-- <ldap:context-source id="mydomainContextSource" -->
<!-- userDn="${ldap.authentication.manager.userdn}" -->
<!-- username="${ldap.authentication.manager.username}" -->
<!-- password="${ldap.authentication.manager.password}" -->
<!-- url="${ldap.authentication.server.urls}" -->
<!-- base="${ldap.authentication.basedn}" /> -->
<bean id="mydomainContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="pooled" value="false"/>
<property name="urls">
<bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
<constructor-arg type="java.lang.String" value="${ldap.authentication.server.urls}"/>
</bean>
</property>
<property name="userDn" value="${ldap.authentication.manager.userdn}"/>
<!-- <property name="username" value="${ldap.authentication.manager.userdn}"/> -->
<!-- <property name="username" value="${ldap.authentication.manager.username}"/> -->
<property name="password" value="${ldap.authentication.manager.password}"/>
<property name="baseEnvironmentProperties">
<map>
<entry key="com.sun.jndi.ldap.connect.timeout" value="${ldap.authentication.jndi.connect.timeout}" />
<entry key="com.sun.jndi.ldap.read.timeout" value="${ldap.authentication.jndi.read.timeout}" />
<entry key="java.naming.security.authentication" value="${ldap.authentication.jndi.security.level}" />
</map>
</property>
</bean>
<ldap:ldap-template id="mydomainLdapTemplate"
ignore-partial-result="true"
context-source-ref="mydomainContextSource"/>
</beans>
我试过在 userdn 和用户名之间切换(在 src\main\resources\ldap.properties
中),但都不起作用。
ldap.authentication.manager.userdn=cn=myacct,dc=mydomain,dc=sunyjcc,dc=edu
ldap.authentication.manager.username=myacct@mydomain.sunyjcc.edu
我也试过在 bean 配置中在用户名和 userDn 之间切换,但似乎没有任何效果。谁能告诉我我做错了什么?
ActiveDirectoryLdapAuthenticationProvider 似乎不是一个选项,因为我不是要验证身份,而是要修改用户记录。
谢谢!
Ed.
嗯,有时候问对问题比得到正确答案更重要。结果是 Spring Boot 不会自动检测 XML 配置,你必须手动检测。通过将 @ImportResource 注释添加到您的主 class,这很容易做到。你改变这个:
@SpringBootApplication
public class GatewayLdapApplication implements CommandLineRunner {
到此。
@SpringBootApplication
@ImportResource(["classpath*:applicationContext.xml"])
public class GatewayLdapApplication implements CommandLineRunner {
现在它连接得很好。
Ed.