Spring Security LDAP简介

2023/05/17

1. 概述

在这个快速教程中,我们将学习如何设置Spring Security LDAP。

在我们开始之前,先说明一下LDAP是什么-它代表轻量级目录访问协议,它是一种开放的、供应商中立的协议,用于通过网络访问目录服务。

进一步阅读

Spring LDAP概述

了解如何使用Spring LDAP API对用户进行身份验证和搜索,以及在目录服务器中创建和修改用户。

阅读更多

Spring Data LDAP指南

了解如何将Spring Data与LDAP结合使用。

阅读更多

使用Spring Security的Spring Data

了解如何将Spring Data与Spring Security集成。

阅读更多

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配置

接下来,让我们讨论一下我们的Spring Security Java配置:

public class SecurityConfig {

    @Bean
    ApacheDSContainer ldapContainer() throws Exception {
        return new ApacheDSContainer("dc=taketoday,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相关的部分-完整的Java配置可以在这里找到。

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=taketoday,dc=com" ldif="users.ldif"/>

同样,这只是配置的一部分-与LDAP相关的部分;完整的XML配置可以在这里找到。

5. LDAP数据交换格式

LDAP数据可以使用LDAP数据交换格式(LDIF)来表示-以下是我们的用户数据示例:

dn: ou=groups,dc=taketoday,dc=com
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: ou=people,dc=taketoday,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people

dn: uid=taketoday,ou=people,dc=taketoday,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Jim Beam
sn: Beam
uid: taketoday
userPassword: password

dn: cn=admin,ou=groups,dc=taketoday,dc=com
objectclass: top
objectclass: groupOfNames
cn: admin
member: uid=taketoday,ou=people,dc=taketoday,dc=com

dn: cn=user,ou=groups,dc=taketoday,dc=com
objectclass: top
objectclass: groupOfNames
cn: user
member: uid=taketoday,ou=people,dc=taketoday,dc=com

6. 使用Spring Boot

在处理Spring Boot项目时,我们还可以使用Spring Boot Starter Data Ldap依赖项,它会自动为我们检测LdapContextSource和LdapTemplate

要启用自动配置,我们需要确保在pom.xml中将spring-boot-starter-data-ldap Starter或spring-ldap-core定义为依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>

要连接到LDAP,我们需要在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

有关Spring Data LDAP自动配置的更多详细信息可以在官方文档中找到。Spring Boot引入了LdapAutoConfiguration,它负责检测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. 总结

在这个使用LDAP的Spring Security快速指南中,我们学习了如何使用LDIF配置基本系统并配置该系统的安全性。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章