SpringCloud进行AD域查询

查询工具

package com.kittlen.cloud.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ldap.core.DirContextOperations;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.AbstractContextMapper;
import org.springframework.ldap.query.ContainerCriteria;
import org.springframework.ldap.query.LdapQueryBuilder;

import java.util.ArrayList;
import java.util.List;

import static org.springframework.ldap.query.LdapQueryBuilder.query;

/**
 * @author kittlen
 * @email kittlen@qq.com
 */
@Slf4j
@Component
public class LdapQueryUtil {
    public static final String OBJECT_CLASS = "objectClass";//对象类型
    public static final String DISTINGUISHED_NAME="distinguishedName";//dn
    public static final String TELEPHONE_NUMBER = "telephoneNumber";//电话号码
    public static final String MAIL = "mail";//邮箱
    public static final String DISPLAY_NAME = "displayName";//显示名称
    public static final String DESCRIPTION = "description";//描述
    public static final String USER_ACCOUNT_CONTROL = "userAccountControl";//用户状态
    public static final String ACTIVATE = "512";//激活状态
    public static final String DEACTIVATE = "514";//禁用状态
    public static final String USER_PRINCIPAL_NAME = "userPrincipalName";//登录系统的用户名(Windows2000 以前版本 ) 登录信息必须为唯一
    public static final String SAM_ACCOUNT_NAME = "sAMAccountName";//登录系统的用户名(Windows2000 以前版本 ) 登录信息必须为唯一
    public static final String UNICODE_PWD = "unicodePwd";//密码

    @Autowired
    LdapTemplate ldapTemplate;

    /**
     * 查询ad域中的信息
     * @param base 根节点 可以为空
     * @param conditionList 条件 使用ldapConditionBuild构造ldapCondition
     * @return
     */
    public List queryBy(String base, List<ldapCondition> conditionList) {
        LdapQueryBuilder queryBuilder = query().base(base == null ? "" : base);
        if (conditionList != null && !conditionList.isEmpty()) {
            ContainerCriteria criteria = queryBuilder.where(conditionList.get(0).getKey()).is(conditionList.get(0).getValue());
            if (conditionList.size() > 1) {
                for (int i = 1; i < conditionList.size(); i++) {
                    criteria.and(conditionList.get(0).getKey()).is(conditionList.get(0).getValue());
                }
            }
        }else{//构建查询语句时,必须要有条件
           	queryBuilder.where(DISTINGUISHED_NAME).isPresent();
        }
        List<Object> list = ldapTemplate.search(queryBuilder, new AbstractContextMapper<Object>() {
            @Override
            protected Object doMapFromContext(DirContextOperations dirContextOperations) {
//                NamingEnumeration<? extends Attribute> all = dirContextOperations.getAttributes().getAll();
//                try {
//                    while (all.hasMore()) {
//                        log.info("key: {} ,value: {}",all.next().getID(),all.next().get().toString());
//                    }
//                } catch (Exception e) {
//                    log.error(e.getMessage());
//                }
//                return dirContextOperations.getDn().toString();
                return dirContextOperations.getNameInNamespace();
            }
        });
        return list;
    }

    /**
     *
     * 查询ad域中的信息
     * @param base 根节点 可以为空
     * @param conditionList 条件 使用ldapConditionBuild构造ldapCondition
     * @param objectType 查询类型
     * @return
     */
    public List queryBy(String base, List<ldapCondition> conditionList, ObjectType objectType) {
        switch (objectType) {
            case USER:
                conditionList.addAll(user());
                break;
            case ORGANIZATION:
                conditionList.addAll(org());
                break;
        }
        return queryBy(base, conditionList);
    }

    private List<ldapCondition> org() {
        List<ldapCondition> ldapConditions = new ArrayList<>();
        ldapConditions.add(ldapConditionBuild("objectClass", "top"));
        ldapConditions.add(ldapConditionBuild("objectClass", "organizationalUnit"));
        return ldapConditions;
    }

    private List<ldapCondition> user() {
        List<ldapCondition> ldapConditions = new ArrayList<>();
        ldapConditions.add(ldapConditionBuild("objectClass", "top"));
        ldapConditions.add(ldapConditionBuild("objectClass", "person"));
        ldapConditions.add(ldapConditionBuild("objectClass", "organizationalUnit"));
        ldapConditions.add(ldapConditionBuild("objectClass", "user"));
        return ldapConditions;
    }

    public enum ObjectType {
        USER, ORGANIZATION
    }

    public ldapCondition ldapConditionBuild(String key, String value) {
        return new ldapCondition(key, value);
    }

    public class ldapCondition {
        private String key;
        private String value;

        private String getKey() {
            return key;
        }

        private void setKey(String key) {
            this.key = key;
        }

        private String getValue() {
            return value;
        }

        private void setValue(String value) {
            this.value = value;
        }

        private ldapCondition() {

        }

        private ldapCondition(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }
}

使用方法

	@Autowired
    LdapQueryUtil queryUtil;

    public list queryBy(){
        List<LdapQueryUtil.ldapCondition> queryList = new ArrayList<>();
        queryList.add(queryUtil.ldapConditionBuild(LdapQueryUtil.DISPLAY_NAME,"kittlen"));
        List<String> list= queryUtil.queryBy("ou=根组织机构", queryList , LdapQueryUtil.ObjectType.USER);
        return list;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值