package com.spring.modules.sys.task; import com.alibaba.fastjson.JSONArray; import com.spring.common.utils.LdapReadUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; import java.io.IOException; import java.util.Map; import java.util.Properties; /** * 定时同步域控账号信息到 Redis */ @Component @EnableScheduling public class LdapAccountRefreshTask { private static final Logger logger = LoggerFactory.getLogger(LdapAccountRefreshTask.class); @Value("${spring.ldap.urls}") private String ldapUrl; @Value("${spring.ldap.base}") private String ldapBase; @Value("${spring.ldap.username}") private String ldapUserDn; @Value("${spring.ldap.password}") private String ldapPassword; @Autowired private RedisTemplate redisTemplate; @Scheduled(cron = "${task.data.refreshLdapAccountToRedis}") public void refreshLdapAccountToRedis() throws NamingException { //首先查询域控账号的所有数据 Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUrl); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, ldapUserDn); env.put(Context.SECURITY_CREDENTIALS, ldapPassword); env.put(Context.REFERRAL, "ignore"); LdapContext ctx = null; //尝试解析数据 try{ // 创建DirContext对象,建立与LDAP服务器的连接 ctx = new InitialLdapContext(env, null); //调用方法读取数据 Map ldapAccountMap = LdapReadUtils.getAllLdapAccount(ctx, ldapBase, redisTemplate); logger.info("域控账号缓存的数量:"+ldapAccountMap.size()); // 数据放到redis中去 // redisTemplate.opsForHash().putAll("ldapAccount", ldapAccountMap); logger.info("域控账号缓存:"+ JSONArray.toJSONString(ldapAccountMap)); } catch (NamingException | IOException e) { logger.error("Failed to connect to the LDAP server."); } finally{ if (null != ctx){ ctx.close(); } } } }