SringLdap,基于对CSV文件的解析来批量增加,更新AD用户——超详细

根据csv文件批量更新AD域的用户

1、解析CSV文件并确定是新增还是更新用户

package com.lls.it.ldapapi.service;

import com.lls.it.ldapapi.entity.AdUser;
import com.lls.it.ldapapi.exception.UserExistException;
import com.lls.it.ldapapi.exception.UserNotFoundException;
import com.opencsv.CSVReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.FileReader;

@Service
public class CSVReaderService {

    private static final String USER_ACCOUNT_CONTROL = "66048";

    @Autowired
    private UserService userService;

    /**
     * dealType: 1, create用户; 2, update用户
     * 根据导入的CSV文件批量新增用户
     */
    public boolean ParseCSVFile(String file, Integer dealType) {
        try {
            CSVReader reader = null;
            reader = new CSVReader(new FileReader(file));
            String[] line = null;
            reader.readNext();
            // 批量创建用户
            if (dealType == 1) {
                while ((line = reader.readNext()) != null) {
                    if (userService.findByAccountName(line[0]) == null) {
                        batchCreateADUser(line);
                    } else {
                        throw new UserExistException(String.format("user %s has existed", line[3]));
                    }
                }
            }
            // 批量更新用户
            else if (dealType == 2) {
                while ((line = reader.readNext()) != null) {
                    if (userService.findByAccountName(line[0]) == null) {
                        throw new UserNotFoundException(String.format("user %s not found", line[3]));
                    } else {
                        batchUpdateADUser(line);
                    }
                }
            } else {
                System.out.println("暂不支持该功能!");
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

2、新增用户

    private void batchCreateADUser(String[] line) throws Exception {
        AdUser adUser = buildAddAttributes(line);
        userService.saveAdUser(adUser);
    }

3、更新用户

    private void batchUpdateADUser(String[] line) throws Exception {
        AdUser adUser = buildUpdateAttributes(line);
        userService.updateAdUser(adUser);

        /**
         * 如果AdUser更新了OU信息,update只会更新基本属性
         * 判断是否换了OU,是则调用更换方法
         */
        String oldDn = userService.findByName(line[3]).getDn();
        String oldId = userService.findByName(line[3]).getId().toString();
        String oldOU = userService.getOU(oldDn);
        String newOU = userService.getOU(line[6]);
        boolean isChangeOU = !oldOU.equalsIgnoreCase(newOU);
        System.out.println(isChangeOU);
        if (isChangeOU) {
            userService.changeOU(oldId, newOU);
        }
    }

private String getOU(String source) {
       String regex = "(ou).*?(?=,dc)";
       String result = "";
       Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
       Matcher matcher = pattern.matcher(source);
           while (matcher.find()) {
              result = matcher.group();       
           }
       return result;    
       }

    private AdUser buildUpdateAttributes(String[] line) throws Exception {
        /**
         * 更新用户默认名字之类的不会修改
         * 更改OU在外层处理
         */
        AdUser adUser = userService.findByName(line[3]);
        if (adUser == null) {
            throw new UserNotFoundException(String.format("user %s not found", line[3]));
        }
        adUser.setMobile(line[10]);
        AdUser manager = userService.findByName(line[14]);
        if (manager == null) {
            throw new UserNotFoundException(String.format("manager %s not found", line[14]));
        } else {
            adUser.setManager(manager.getDn());
        }
        adUser.setCompany(line[15]);
        adUser.setOffice(line[17]);
        adUser.setFlags(line[18]);
        adUser.setDepartment(line[19]);
        adUser.setTitle(line[20]);
        adUser.setInfo(line[21]);
        adUser.setEmployeeType(line[26]);
        return adUser;
    }

4、建立增加用户的ADUser对象

    private AdUser buildAddAttributes(String[] line) throws Exception {
        AdUser adUser = new AdUser();
        adUser.setAccountName(line[0]);
        adUser.setSurName(line[1]);
        adUser.setGivenName(line[2]);
        adUser.setName(line[3]);
        adUser.setDisplayName(line[4]);
        adUser.setUserPrincipalName(line[5]);
        String userOU = userService.getOU(line[6]);
        adUser.setDn("CN=" + line[0] + "," + userOU);
        adUser.setEmployeeID(line[7]);
        adUser.setMobile(line[10]);
        AdUser manager = userService.findByName(line[14]);
        if (manager == null) {
            throw new UserNotFoundException(String.format("manager %s not found", line[14]));
        } else {
            adUser.setManager(manager.getDn());
        }
        adUser.setCompany(line[15]);
        adUser.setEmail(line[16]);
        adUser.setOffice(line[17]);
        adUser.setFlags(line[18]);
        adUser.setDepartment(line[19]);
        adUser.setTitle(line[20]);
        adUser.setInfo(line[21]);
        adUser.setChineseName(line[23]);
        adUser.setUserPassword("\""+line[24]+"\"");
        adUser.setEmployeeType(line[26]);
        adUser.setGender(line[27]);
        adUser.setUserAccountControl(USER_ACCOUNT_CONTROL);
        return adUser;
    }
}

5、写一个测试

    @Test
    public void testParseCSVAndCreateAD() {
        String file = "/Users/fitz.bai/Downloads/add_20180730.csv";
        csvReaderService.ParseCSVFile(file, 1);
    }

    @Test
    public void testParseCSVAndUpdateAD() {
        String file = "/Users/fitz.bai/Downloads/update_20180731.csv";
        csvReaderService.ParseCSVFile(file, 2);
    }

结论

1、批量新增、更新用户其实分开就还是对单个用户的增加和更新。
2、要判断很多字段是否存在,以免出新空指针异常
3、这里我们的需求时批量新增和批量更新不一起,所以也不用区分每一个用户是什么操作

注意

更新用户时,如果用户更换部门,即OU会变化,则rebind函数或者update并不会更新OU/DN,这些地段还是不变的,因此要在添加changeOU的操作,代码中也有体现。

猜你喜欢

转载自blog.csdn.net/qq_22798455/article/details/81346947