1. 개요
LDAP 디렉토리 서버는 읽기 최적화 된 계층 적 데이터 저장소입니다. 일반적으로 사용자 인증 및 권한 부여에 필요한 사용자 관련 정보를 저장하는 데 사용됩니다.
이 기사에서는 사용자를 인증 및 검색하고 디렉토리 서버에서 사용자를 만들고 수정하는 Spring LDAP API를 살펴 봅니다. LDAP에서 다른 유형의 항목을 관리하는 데 동일한 API 세트를 사용할 수 있습니다.
2. Maven 의존성
필요한 Maven 의존성을 추가하여 시작하겠습니다.
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
이 의존성의 최신 버전은 spring-ldap-core 에서 찾을 수 있습니다 .
3. 데이터 준비
이 기사의 목적을 위해 먼저 다음 LDAP 항목을 생성 해 보겠습니다.
ou=users,dc=example,dc=com (objectClass=organizationalUnit)
이 노드에서 새 사용자를 만들고, 기존 사용자를 수정하고, 기존 사용자를 인증하고, 정보를 검색합니다.
4. 스프링 LDAP API
4.1. ContextSource 및 LdapTemplate Bean 정의
ContextSource 는 LdapTemplate 을 만드는 데 사용됩니다 . 다음 섹션에서 사용자 인증 중 ContextSource 사용을 살펴 보겠습니다.
@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;
}
LdapTemplate 은 LDAP 항목의 생성 및 수정에 사용됩니다.
@Bean
public LdapTemplate ldapTemplate() {
return new LdapTemplate(contextSource());
}
4.2. 사용자 인증
이제 기존 사용자를 인증하는 간단한 논리를 구현해 보겠습니다.
public void authenticate(String username, String password) {
contextSource
.getContext(
"cn=" +
username +
",ou=users," +
env.getRequiredProperty("ldap.partitionSuffix"), password);
}
4.3. 사용자 생성
다음으로 새 사용자를 만들고 LDAP에 암호의 SHA 해시를 저장해 보겠습니다.
인증시 LDAP 서버는 제공된 비밀번호의 SHA 해시를 생성하고 저장된 비밀번호와 비교합니다.
public void create(String username, String password) {
Name dn = LdapNameBuilder
.newInstance()
.add("ou", "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);
}
digestSHA () 는 제공된 암호의 SHA 해시의 Base64 인코딩 문자열을 반환하는 사용자 지정 메서드입니다.
마지막으로 LdapTemplate 의 bind () 메서드 는 LDAP 서버에 항목을 만드는 데 사용됩니다.
4.4. 사용자 수정
다음 방법으로 기존 사용자 또는 항목을 수정할 수 있습니다.
public void modify(String username, 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);
}
lookupContext () 메소드는 제공된 사용자를 찾기 위해 사용된다.
4.5. 사용자 검색
검색 필터를 사용하여 기존 사용자를 검색 할 수 있습니다.
public List<String> search(String username) {
return ldapTemplate
.search(
"ou=users",
"cn=" + username,
(AttributesMapper<String>) attrs -> (String) attrs.get("cn").get());
}
AttributesMapper가 있는 항목에서 원하는 속성 값을 가져 오는 데 사용됩니다. 내부적으로 Spring LdapTemplate 은 발견 된 모든 항목에 대해 AttributesMapper 를 호출 하고 속성 값 List을 생성합니다.
5. 테스트
spring-ldap-test 는 ApacheDS 1.5.5를 기반으로하는 임베디드 LDAP 서버를 제공합니다. 테스트를 위해 임베디드 LDAP 서버를 설정하려면 다음 Spring Bean을 구성해야합니다.
@Bean
public TestContextSourceFactoryBean testContextSource() {
TestContextSourceFactoryBean contextSource
= new TestContextSourceFactoryBean();
contextSource.setDefaultPartitionName(
env.getRequiredProperty("ldap.partition"));
contextSource.setDefaultPartitionSuffix(
env.getRequiredProperty("ldap.partitionSuffix"));
contextSource.setPrincipal(
env.getRequiredProperty("ldap.principal"));
contextSource.setPassword(
env.getRequiredProperty("ldap.password"));
contextSource.setLdifFile(
resourceLoader.getResource(
env.getRequiredProperty("ldap.ldiffile")));
contextSource.setPort(
Integer.valueOf(
env.getRequiredProperty("ldap.port")));
return contextSource;
}
JUnit으로 사용자 검색 방법을 테스트 해 보겠습니다.
@Test
public void
givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() {
List<String> users = ldapClient
.search(SEARCH_STRING);
assertThat(users, Matchers.containsInAnyOrder(USER2, USER3));
}
6. 결론
이 기사에서는 Spring LDAP API를 소개하고 LDAP 서버에서 사용자 인증, 사용자 검색, 사용자 생성 및 수정을위한 간단한 방법을 개발했습니다.
항상 그렇듯이이 Github 프로젝트 에서 전체 소스 코드를 사용할 수 있습니다 . 테스트는 Maven 프로필 "live"아래에 생성되므로 "-P live"옵션을 사용하여 실행할 수 있습니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-ldap
'Java' 카테고리의 다른 글
Spring Security 5 – OAuth2 로그인 (0) | 2021.04.10 |
---|---|
Spring Security 5.1 클라이언트로 권한 부여 및 토큰 요청 사용자 지정 (0) | 2021.04.10 |
SpringData LDAP 사용방법(예제) (0) | 2021.04.10 |
JDBC를 사용한 Spring 세션 (0) | 2021.04.10 |
MongoDB를 사용한 Spring 세션 (0) | 2021.04.09 |