gpt4 book ai didi

java - 不使用管理员/经理帐户的 Spring LDAP 身份验证

转载 作者:行者123 更新时间:2023-11-30 09:40:58 25 4
gpt4 key购买 nike

我的要求是验证用户的登录名(用户名和密码)以便能够访问 Web 应用程序。

使用 Java,我能够使用用户提供的登录名进行身份验证:

boolean isCredentialsValid = false;

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapUrl);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);

try {
DirContext ctx = new InitialDirContext(env);
ctx.close();
isCredentialsValid = true;
} catch (Exception e) {
e.printStackTrace();
}

System.out.println(isCredentialsValid);

这个可以直接用Spring实现吗?喜欢使用 BindAuthenticator 或 PasswordComparisonAuthenticator 吗?我尝试使用此配置:

<bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="IP of LDAP Server:389" />
</bean>

<bean id="ldapAuthenticator"
class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
<constructor-arg ref="contextSource"/>
<property name="userDNPatterns" >
<list>
<value>uid={0}, dc=company,dc=com</value>
</list>
</property>
</bean>

<bean id="userSearch"
class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg index="0" value="ou=people" />
<constructor-arg index="1" value="(uid={0})" />
<constructor-arg index="2" ref="contextSource" />
<property name="searchSubtree" value="true" />
</bean>

但是我遇到了 UncategorizedLdapException。

到目前为止,根据我在 Spring LDAP 上阅读的内容,我无法在不提供管理员帐户的情况下直接验证用户的登录。

非常感谢任何帮助!

这是堆栈跟踪:

Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906DC, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db0]; remaining name 'uid=username@company.com'; nested exception is org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906DC, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db0]; remaining name 'uid=username@company.com'

最佳答案

LdapTemplate (spring-ldap-core 1.3.1RELEASE) 在这种情况下是无用的(糟糕的是,我相信它对其他人也无用)- 因为在 LdapTemplate.authenticate(...) 方法上执行搜索, 这显然不能在没有成功绑定(bind)的情况下完成。

我采用了与 ActiveDirectoryLdapAuthenticationProvider 中相同的概念:

  1. 使用旧方式对 LDAP 进行身份验证

    private static DirContext bindAsUser(String username, String password) {
    final String bindUrl = url;

    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    String bindPrincipal = username;
    env.put(Context.SECURITY_PRINCIPAL, bindPrincipal);
    env.put(Context.PROVIDER_URL, bindUrl);
    env.put(Context.SECURITY_CREDENTIALS, password);
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

    try {
    return contextFactory.createContext(env);
    } catch (NamingException e) {
    throw new RuntimeException(e);
    }
    }
  2. 使用 SpringSecurityLdapTemplate 查询 LDAP

spring-ldap-core 1.3.1RELEASE 的另一个问题,我不明白为什么它没有合并到 spring-security-ldap: 3.1。

关于java - 不使用管理员/经理帐户的 Spring LDAP 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com