gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:43:08 30 4
gpt4 key购买 nike

我使用带有 AD 的 win server 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();
}

}

application.properties

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!";
}

}

AD结构。

AD

应用程序结构

Application structure

据我了解contextSource中的问题。我该如何解决?

感谢任何帮助。

最佳答案

您尚未启动 Spring 申请。这就是spring的起点,不初始化什么都干不了。您必须将这样的内容添加到您的 main 方法中:

SpringApplication.run(Application.class, args);

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

@SpringBootApplication

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

关于java - 无法在 Spring LDAP 中进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44070438/

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