无法在Spring LDAP中进行身份验证

yqlxgs2m  于 2022-09-18  发布在  Spring
关注(0)|答案(2)|浏览(212)

我使用带有AD的Win服务器2003。并希望通过Spring LDAP进行连接。尝试连接到http://localhost:8090/时出错:

2017-05-19 22:48:46.768 ERROR 18868 --- [nio-8090-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
    at hello.ldap.client.LdapClient.authenticate(LdapClient.java:26) ~[classes/:na]
    at hello.HelloController.index(HelloController.java:13) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
<...>

来自baeldung.com的代码

LdapClient

package hello.ldap.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.ldap.core.*;
import org.springframework.ldap.support.LdapNameBuilder;

import javax.naming.Name;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.List;

public class LdapClient {

    @Autowired
    private Environment env;

    @Autowired
    private ContextSource contextSource;

    @Autowired
    private LdapTemplate ldapTemplate;

    public void authenticate(final String username, final String password) {
        contextSource.getContext("cn=" + username + ",cn=users," + env.getRequiredProperty("ldap.partitionSuffix"), password);
    }

    public List<String> search(final String username) {
        return ldapTemplate.search(
          "cn=users",
          "cn=" + username,
          (AttributesMapper<String>) attrs -> (String) attrs
          .get("cn")
          .get());
    }

    public void create(final String username, final String password) {
        Name dn = LdapNameBuilder
          .newInstance()
          .add("cn", "users")
          .add("cn", username)
          .build();
        DirContextAdapter context = new DirContextAdapter(dn);

        context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" });
        context.setAttributeValue("cn", username);
        context.setAttributeValue("sn", username);
        context.setAttributeValue("userPassword", digestSHA(password));

        ldapTemplate.bind(context);
    }

    public void modify(final String username, final String password) {
        Name dn = LdapNameBuilder
          .newInstance()
          .add("ou", "users")
          .add("cn", username)
          .build();
        DirContextOperations context = ldapTemplate.lookupContext(dn);

        context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" });
        context.setAttributeValue("cn", username);
        context.setAttributeValue("sn", username);
        context.setAttributeValue("userPassword", digestSHA(password));

        ldapTemplate.modifyAttributes(context);
    }

    private String digestSHA(final String password) {
        String base64;
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA");
            digest.update(password.getBytes());
            base64 = Base64
              .getEncoder()
              .encodeToString(digest.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        return "{SHA}" + base64;
    }
}

AppConfig

package hello.ldap.javaconfig;

import hello.ldap.client.LdapClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;

@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = { "hello.ldap.*" })
@Profile("default")
public class AppConfig {

    @Autowired
    private Environment env;

    @Bean
    public LdapContextSource contextSource() {
        LdapContextSource contextSource = new LdapContextSource();
        contextSource.setUrl(env.getRequiredProperty("ldap.url"));
        contextSource.setBase(env.getRequiredProperty("ldap.partitionSuffix"));
        contextSource.setUserDn(env.getRequiredProperty("ldap.principal"));
        contextSource.setPassword(env.getRequiredProperty("ldap.password"));
        return contextSource;
    }

    @Bean
    public LdapTemplate ldapTemplate() {
        return new LdapTemplate(contextSource());
    }

    @Bean
    public LdapClient ldapClient() {
        return new LdapClient();
    }

}

应用程序.属性

server.port = 8090
ldap.partitionSuffix=dc=GRSU,dc=local
ldap.partition=GRSU
ldap.principal=cn=Jack Wood,cn=users
ldap.password=1234
ldap.port=389
ldap.url=ldap://192.168.56.101

起点应用程序

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

HelloController

package hello;

import hello.ldap.client.LdapClient;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        LdapClient ldapClient = new LdapClient();
        ldapClient.authenticate("Jack Wood", "1234");
        return "Greetings from Spring Boot!";
    }

}

广告结构。

应用程序结构

据我所知,contextSource中的问题。我怎么才能修好?

如有任何帮助,我们不胜感激。

hfwmuf9z

hfwmuf9z1#

您尚未启动您的Spring应用程序。这是Spring的起点,不初始化什么工作都不会。您必须将类似以下内容添加到Main方法中:

SpringApplication.run(Application.class, args);

并添加以下注解(如果您使用的是SprringBoot):

@SpringBootApplication

https://spring.io/guides/gs/spring-boot/

rqqzpn5f

rqqzpn5f2#

问题是,您必须在artitionSuffix中定义一个子域:

原件:

ldap.partitionSuffix=dc=GRSU,dc=local

更正:

ldap.partitionSuffix=ou=Users,dc=GRSU,dc=local

相关问题