springboot操作ldap全过程
以下可能不是特别深入讲解,只是开发用到,浅谈一下。尽量用数据库的方式去对应
LDAP:轻量级目录访问协议。
微软的AD域,openldap之类的都可以通过LDAP协议去连接访问。
ad(active diretory)活动目录;openldap就是ldap协议的具体实现。
在这里把他们当成一个数据库来看待,目录存储数据库。
如下图,就是openldap的层级图。

1. 专有名词
关于这一块涉及到很多专有名词这里简单谈一下。
- dc:表示域名的意思,就是一个域的名称,可以当成数据库中的库名来看待。
- ou:组织单元,就像一层层的文件夹看待,这个ou可以有多个层级,就是ou下还可以有ou,当成数据库中的表看待
- cn:用户名或服务器名。就相当于数据库某一行用户信息的主键
- dn:相当于绝对路径,由cn+ou+dc组成。如上图alice的dn就是 cn=alice,ou=school,dc=demo,dc=com
每个用户是有多个属性值的,就好比数据库中的字段,一行用户有多个字段信息

2. springboot连接
导入依赖
<!--ldap-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>application.properties配置文件。这里连接的账户不是ldap目录下管理的用户,就是别用上述的alice这种用户去连接。
#AD认证 spring.ldap.urls=ldap://127.0.0.1:389 spring.ldap.username=cn=admin,dc=demo,dc=com spring.ldap.password=123456 spring.ldap.base=ou=school,dc=demo,dc=com
自定义配置类
@Configuration
public class LdapConfig {
@Value("${spring.ldap.urls}")
private String ldapUrl;
@Value("${spring.ldap.username}")
private String userName;
@Value("${spring.ldap.password}")
private String password;
@Bean
public LdapContextSource ldapContextSource() {
LdapContextSource source = new LdapContextSource();
source.setUrl(ldapUrl);
source.setUserDn(userName);
source.setPassword(password);
return source;
}
@Bean
public LdapTemplate ldapTemplate() {
return new LdapTemplate(ldapContextSource());
}
}基本上如上配置就可以操作了
测试是否可以连接,直接调用接口,能成功连接就会输出数据,无法连接会出现认证异常。


3. 按条件查询
先上案例,查询cn属性值为alice的。这里没有指定返回的属性有哪些,所以返回的就是所有属性。稍后再解释Person和PersonMapper

Person就是一个普通实体类,就像平时查询数据库数据时都是用实体类接收数据
@Data
public class Person {
private String cn;
private String displayName;
private String givenName;
private String eMail;
private String ou;
}PersonMapper类就不一样了,必须继承AttributesMapper类,实现mapFromAttributes方法。
当ldapTemplate通过条件筛选出数据时,一行数据就会调用一次这个方法,attributes带有查出的属性值
@Slf4j
public class PersonMapper implements AttributesMapper<Person> {
@Override
public Person mapFromAttributes(Attributes attributes) throws NamingException {
log.info(attributes.toString());
Person result = new Person();
result.setCn(attributes.get("cn").get().toString());
return result;
}
}筛选方式有很多,必须有筛选条件才能查询。
加上attributes(new String[]{"cn", "mail"}),就只会查询出这两个属性值
LdapQuery query = LdapQueryBuilder.query()
.base(base)
.searchScope(SearchScope.SUBTREE)
.attributes(new String[]{"cn", "mail"})
.where("cn")
.is("alice");可以用filter筛选,也是cn属性值为alice的筛选条件。
LdapQuery query = LdapQueryBuilder.query()
.base(base)
.searchScope(SearchScope.SUBTREE)
.filter("(cn=alice)");base下所有内容带有objectClass属性,都会被查出来。
如果base自身也带有,自身也会被查出来
LdapQuery query = LdapQueryBuilder.query()
.base(base)
.searchScope(SearchScope.SUBTREE)
.filter("(objectClass=*)");多条件筛选,cn为alice并且mail为123@qq.com的内容。
LdapQuery query = LdapQueryBuilder.query()
.base(base)
.searchScope(SearchScope.SUBTREE)
.filter("(&(cn=alice)(mail=123@qq.com))");总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Intellij IDEA命令行执行java无法加载主类解决方案
这篇文章主要介绍了Intellij IDEA命令行执行java无法加载主类解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-09-09
mybatis创建项目报Invalid bound statement (not found)错误解决方法
使用MyBatis能够帮助我们将SQL语句和Java代码分离,这篇文章主要给大家介绍了关于mybatis创建项目报Invalid bound statement (not found)错误的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-05-05
MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建(图文教程)
这篇文章主要介绍了MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建(图文教程),非常具有实用价值,需要的朋友可以参考下2017-12-12
详解mybatis-plus使用@EnumValue注解的方式对枚举类型的处理
这篇文章主要介绍了详解mybatis-plus使用@EnumValue注解的方式对枚举类型的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-12-12
MyEclipse2018中安装Mybatis generator插件的实现步骤
这篇文章主要介绍了MyEclipse2018中安装Mybatis generator插件的实现步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-02-02


最新评论