根据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的操作,代码中也有体现。