1. 概述
本教程,我们讲学习如何搭建Spring Security LDAP。
开始之前,先了解什么是LDAP。LDAP是“Lightweight Directory Access Protocol”的缩写(轻型目录访问协议),它是一个开放的,中立的,工业标准的应用协议,通过网络提供目录访问服务。
2. Maven依赖
首先添加所需maven依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.apache.directory.server</groupId>
<artifactId>apacheds-server-jndi</artifactId>
<version>1.5.5</version>
</dependency>
我们使用ApacheDS 作为我们LDAP服务器,它是一个可扩展、嵌入式的目录服务器。
3. Java 配置
下面,我们通过Java代码方式配置Spring Security:
public class SecurityConfig {
@Bean
ApacheDSContainer ldapContainer() throws Exception {
return new ApacheDSContainer("dc=baeldung,dc=com", "classpath:users.ldif");
}
@Bean
LdapAuthoritiesPopulator authorities(BaseLdapPathContextSource contextSource) {
String groupSearchBase = "ou=groups";
DefaultLdapAuthoritiesPopulator authorities = new DefaultLdapAuthoritiesPopulator
(contextSource, groupSearchBase);
authorities.setGroupSearchFilter("(member={0})");
return authorities;
}
@Bean
AuthenticationManager authenticationManager(BaseLdapPathContextSource contextSource,
LdapAuthoritiesPopulator authorities) {
LdapBindAuthenticationManagerFactory factory = new LdapBindAuthenticationManagerFactory
(contextSource);
factory.setUserSearchBase("ou=people");
factory.setUserSearchFilter("(uid={0})");
return factory.createAuthenticationManager();
}
}
上面只展示了LDAP相关配置,完整配置请访问这里。
4. XML配置
等效的XML配置:
<authentication-manager>
<ldap-authentication-provider
user-search-base="ou=people"
user-search-filter="(uid={0})"
group-search-base="ou=groups"
group-search-filter="(member={0})">
</ldap-authentication-provider>
</authentication-manager>
<ldap-server root="dc=baeldung,dc=com" ldif="users.ldif"/>
同样,上面只展示了LDAP相关配置,完整XML配置请访问这里。
5. LDAP 数据交换格式
LDAP数据,使用LDIF(LDAP Data Interchange Format)数据交互格式表示,下面是我们user数据例子:
dn: ou=groups,dc=baeldung,dc=com
objectclass: top
objectclass: organizationalUnit
ou: groups
dn: ou=people,dc=baeldung,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people
dn: uid=baeldung,ou=people,dc=baeldung,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Jim Beam
sn: Beam
uid: baeldung
userPassword: password
dn: cn=admin,ou=groups,dc=baeldung,dc=com
objectclass: top
objectclass: groupOfNames
cn: admin
member: uid=baeldung,ou=people,dc=baeldung,dc=com
dn: cn=user,ou=groups,dc=baeldung,dc=com
objectclass: top
objectclass: groupOfNames
cn: user
member: uid=baeldung,ou=people,dc=baeldung,dc=com
6. Spring Boot 集成
Spring Boot项目中可以使用Spring Boot Starter Data Ldap。
mvn 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
application.properties 配置
spring.ldap.url=ldap://localhost:18889
spring.ldap.base=dc=example,dc=com
spring.ldap.username=uid=admin,ou=system
spring.ldap.password=secret
然后就可以使用LdapTemplate:
@Autowired
private LdapTemplate ldapTemplate;
7. 应用
最后,这是我们一个简单的应用
@Controller
public class MyController {
@RequestMapping("/secure")
public String secure(Map<String, Object> model, Principal principal) {
model.put("title", "SECURE AREA");
model.put("message", "Only Authorized Users Can See This Page");
return "home";
}
}
8. 总结
本教程我们介绍了Spring Security LDAP,学习了如何配置和定义LDIF。
惯例,本文完整源代码可从GitHub上获取。