JAVA_基本LDAP操作实例

一、简介

Lightweight Directory Access Protocol (LDAP),轻型目录访问协议是一个访问在线目录服务的协议。下面的例子中简单介绍在java中队ldap的增删该查功能。目录结构为:

CD=CAS,DC=MYDC

--cn=users

----uid=zhangsan

二、示例
1、通过LdapContext连接ldap

复制代码代码如下:

/** 
 * 连接LDAP 
 */  
@SuppressWarnings({ "rawtypes", "unchecked" })  
public LdapContext connetLDAP() throws NamingException {  
    // 连接Ldap需要的信息  
    String ldapFactory = "com.sun.jndi.ldap.LdapCtxFactory";  
    String ldapUrl = "ldap:/IP:port";// url  
    String ldapAccount = "cn=root"; // 用户名  
    String ldapPwd = "password";//密码  
    Hashtable env = new Hashtable();  
    env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory);  
    // LDAP server  
    env.put(Context.PROVIDER_URL, ldapUrl);  
    env.put(Context.SECURITY_AUTHENTICATION, "simple");  
    env.put(Context.SECURITY_PRINCIPAL, ldapAccount);  
    env.put(Context.SECURITY_CREDENTIALS, ldapPwd);  
    env.put("java.naming.referral", "follow");  
    LdapContext ctxTDS = new InitialLdapContext(env, null);  
    return ctxTDS;  
}  

2、增加用户zhangsan
复制代码代码如下:
  
// 添加  
    public void testAdd() throws Exception {  
        LdapContext ctx = connetLDAP();  
        Attributes attrs = new BasicAttributes(true);  
        Attribute objclass = new BasicAttribute("objectclass");  
        // 添加ObjectClass  
        String[] attrObjectClassPerson = { "inetOrgPerson", "organizationalPerson", "person", "top" };  
        Arrays.sort(attrObjectClassPerson);  
        for (String ocp : attrObjectClassPerson) {  
            objclass.add(ocp);  
        }  
        attrs.put(objclass);  
        String uid = "zhangsan";  
        String userDN = "uid=" + uid + "," + "cn=users,dc=cas,dc=mydc";  
        // 密码处理  
        // attrs.put("uid", uid);  
        attrs.put("cn", uid);  
        attrs.put("sn", uid);  
        attrs.put("displayName", "张三");  
        attrs.put("mail", "abc@163.com");  
        attrs.put("description", "");  
        attrs.put("userPassword", "Passw0rd".getBytes("UTF-8"));  
        ctx.createSubcontext(userDN, attrs);  
    }  

3、删除用户zhangsan

复制代码代码如下:

//删除  
    public void testRemove() throws Exception {  
        LdapContext ctx = connetLDAP();  
        String uid = "zhangsan";  
        String userDN = "uid=" + uid + "," + "cn=users,dc=cas,dc=mydc";  
        ctx.destroySubcontext(userDN);  

    }  

4、修改zhangsan的邮件地址

复制代码代码如下:
  
//修改  
    public boolean testModify() throws Exception {  
        boolean result = true;  
        LdapContext ctx = connetLDAP();  
        String uid = "zhangsan";  
        String userDN = "uid=" + uid + "," + "cn=users,dc=cas,dc=mydc";  
        Attributes attrs = new BasicAttributes(true);  
        attrs.put("mail", "zhangsan@163.com");  
        ctx.modifyAttributes(userDN, DirContext.REPLACE_ATTRIBUTE, attrs);  
        return result;  

    }  

5、查找用户
复制代码代码如下:

//查询  
    public void testSearch() throws Exception {  
        LdapContext ctx = connetLDAP();  
        // 设置过滤条件  
        String uid = "zhangsan";  
        String filter = "(&(objectClass=top)(objectClass=organizationalPerson)(uid=" + uid + "))";  
        // 限制要查询的字段内容  
        String[] attrPersonArray = { "uid", "userPassword", "displayName", "cn", "sn", "mail", "description" };  
        SearchControls searchControls = new SearchControls();  
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);  
        // 设置将被返回的Attribute  
        searchControls.setReturningAttributes(attrPersonArray);  
        // 三个参数分别为:  
        // 上下文;  
        // 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;  
        // 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件  
        NamingEnumeration<SearchResult> answer = ctx.search("cn=users,dc=cas,dc=mydc", filter.toString(), searchControls);  
        // 输出查到的数据  
        while (answer.hasMore()) {  
            SearchResult result = answer.next();  
            NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();  
            while (attrs.hasMore()) {  
                Attribute attr = attrs.next();  
                System.out.println(attr.getID() + "=" + attr.get());  
            }  
            System.out.println("============");  
        }  
    }  

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Spring Boot集成LDAP支持SSL的示例程序: 1. 首先,确保你已经在你的Spring Boot项目中添加了LDAP和SSL依赖,可以在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.ldap</groupId> <artifactId>spring-ldap-core</artifactId> <version>2.3.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-ldap</artifactId> <version>5.6.1</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>5.6.1</version> </dependency> <dependency> <groupId>javax.net.ssl</groupId> <artifactId>ssl-context</artifactId> <version>1.0.0</version> </dependency> ``` 2. 创建一个LdapContextSource bean并使用SSL连接: ``` @Configuration public class LdapConfig { @Value("${ldap.url}") private String ldapUrl; @Value("${ldap.userDn}") private String userDn; @Value("${ldap.password}") private String password; @Bean public LdapContextSource contextSource() { LdapContextSource contextSource = new LdapContextSource(); contextSource.setUrl(ldapUrl); contextSource.setUserDn(userDn); contextSource.setPassword(password); // 使用SSL连接 DefaultTlsDirContextAuthenticationStrategy authStrategy = new DefaultTlsDirContextAuthenticationStrategy(); contextSource.setAuthenticationStrategy(authStrategy); contextSource.setContextSource(buildContextSource()); return contextSource; } private LdapContextSource buildContextSource() { LdapContextSource contextSource = new LdapContextSource(); contextSource.setUrl(ldapUrl); contextSource.setUserDn(userDn); contextSource.setPassword(password); // 配置SSL连接 contextSource.setBaseEnvironmentProperties(Collections.unmodifiableMap(Collections.singletonMap("java.naming.ldap.factory.socket", SslSocketFactory.class.getName()))); return contextSource; } } ``` 3. 创建一个LdapAuthenticationProvider bean: ``` @Configuration public class LdapSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private LdapContextSource contextSource; @Value("${ldap.groupSearchBase}") private String groupSearchBase; @Value("${ldap.groupSearchFilter}") private String groupSearchFilter; @Value("${ldap.userSearchBase}") private String userSearchBase; @Value("${ldap.userSearchFilter}") private String userSearchFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic(); } @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(ldapAuthenticationProvider()); } @Bean public LdapAuthenticationProvider ldapAuthenticationProvider() { BindAuthenticator bindAuthenticator = new BindAuthenticator(contextSource); bindAuthenticator.setUserSearch(new FilterBasedLdapUserSearch(userSearchBase, userSearchFilter, contextSource)); bindAuthenticator.afterPropertiesSet(); LdapAuthoritiesPopulator authoritiesPopulator = new DefaultLdapAuthoritiesPopulator(contextSource, groupSearchBase); authoritiesPopulator.setGroupSearchFilter(groupSearchFilter); LdapAuthentication
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值