java对Ldap操作2

package ldap.pojo;

import java.util.List;

/**
 * 
@author 张亮 
 * ldap用户属性信息数据类
 
*/

public class LdapPersonInfo {

    
// ldap中用户的uid属性
    private String uid;

    
// ldap中用户的givenName属性
    private String firstName;

    
// ldap中用户的sn属性

    
private String lastName;

    
// ldap中用户的cn属性

    
private List cn;

    
// ldap中用户的telephonenumber属性
    private String telephone;

    
// ldap中用户的facsimiletelephonenumber属性
    private String fax;

    
// ldap中用户的mail属性
    private String mail;

    
public LdapPersonInfo() {

    }


    
public LdapPersonInfo(String uid, String firstName, String lastName,
            List cn, String telephone, String fax, String mail) 
{
        
this.uid = uid;
        
this.firstName = firstName;
        
this.lastName = lastName;
        
this.cn = cn;
        
this.telephone = telephone;
        
this.fax = fax;
        
this.mail = mail;
    }


    
public String getFax() {
        
return fax;
    }


    
public void setFax(String fax) {
        
this.fax = fax;
    }


    
public String getFirstName() {
        
return firstName;
    }


    
public void setFirstName(String firstName) {
        
this.firstName = firstName;
    }


    
public String getLastName() {
        
return lastName;
    }


    
public void setLastName(String lastName) {
        
this.lastName = lastName;
    }


    
public String getMail() {
        
return mail;
    }


    
public void setMail(String mail) {
        
this.mail = mail;
    }


    
public String getTelephone() {
        
return telephone;
    }


    
public void setTelephone(String telephone) {
        
this.telephone = telephone;
    }


    
public String getUid() {
        
return uid;
    }


    
public void setUid(String uid) {
        
this.uid = uid;
    }


    
public List getCn() {
        
return cn;
    }


    
public void setCn(List cn) {
        
this.cn = cn;
    }

}

UserDaoLdapImpl for jdk1.42

 

package ldap.imp;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

import ldap.UserDaoLdap;
import ldap.pojo.LdapPersonInfo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;

/**
 * 
@author 张亮 UserDaoLdap接口的实现类,主要实现ldap用户认证、查询接口
 * 
 
*/

public class UserDaoLdapImpl implements UserDaoLdap {
    
/**
     * 定义使用springframework对ldap的访问操作对象 借助LdapTemplate可以实现大部分对ldap的操作
     * 
     
*/

    
private LdapTemplate ldapTemplate;
    
    
private final String BASEDN_KEY="org.springframework.ldap.base.path";

    
/**
     * 
@param ldapTemplate
     *            spring setter 注入
     
*/

    
public void setLdapTemplate(LdapTemplate ldapTemplate) {
        
this.ldapTemplate = ldapTemplate;
    }


    
/**
     * 获得所有的用户名(ldap称cn),可根据第二个参数指定返回值是否重复
     * 
     * 
     * 
@param scope
     *            取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,
     *            SUBTREE_SCOPE三个查询范围,分别代表 当前对象查询、当前节点下对象查询、当前节点所有子目录查询
     * 
     * 
@param distinct
     *            true,去掉结构中的重复值;false 允许结果中包含重复值
     * 
     * 
@return 查询范围下返回的cn列表
     
*/

    
public List getAllPersonNames(int scope, boolean distinct) {
        
// 存储查询结果的集合

        
final ArrayList allPersonCnList = new ArrayList();
        
// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象

        ldapTemplate.search(
"""(objectclass=person)",
                createSearchControls(scope), 
new AttributesMapper() {
                    
public Object mapFromAttributes(Attributes attrs)
                            
throws NamingException {
                        
// 获取cn的属性,用户名存在cn中

                        Attribute attr 
= attrs.get("cn");
                        
// 若没有该属性返回null
                        if (attr == null{
                            
return null;
                        }
 else // 获取属性

                            
// 若包含多个cn属性,需要循环获取

                            Enumeration ent 
= attr.getAll();
                            
while (ent.hasMoreElements()) {
                                allPersonCnList.add(ent.nextElement()
                                        .toString());
                            }

                        }

                        
return null;
                    }

                }
);
        
// true,去掉结果中的重复值

        
if (distinct) {
            ArrayList templist 
= new ArrayList();
            
for (int i = 0; i < allPersonCnList.size(); i++)
                
if (!templist.contains(allPersonCnList.get(i))) {
                    templist.add(allPersonCnList.get(i));
                }

            
// 返回无重复值的结果
            return templist;
        }

        
// 返回包含重复值的结果
        return allPersonCnList;
    }


    
/**
     * 查询指定范围下的所有用户信息
     * 
     * 
     * 
@param scope
     *            取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,
     *            SUBTREE_SCOPE三个查询范围,分别代表 当前对象查询、当前节点下对象查询、当前节点所有子目录查询
     * 
     * 
@return 查询范围下返回的所有用户信息列表
     * 
     
*/

    
public List getAllPersons(int scope) {
        
// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象

        
return ldapTemplate.search("""(objectclass=person)",
                createSearchControls(scope), 
new LdapObjectAttributesMapper());
    }


    
/**
     * 根据Uid查询用户信息,*代表任意长度的任意字符
     * 
     * 
     * 
@param uid
     *            用户的uid
     * 
@param scope
     *            取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,
     *            SUBTREE_SCOPE三个查询范围,分别代表 当前对象查询、当前节点下对象查询、当前节点所有子目录查询
     * 
     * 
@return 用户信息
     
*/

    
public List getPersonByUid(String uid, int scope) {
        
// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象

        
// uid 和 objectclass 组成联合查询条件,两个同时满足的查询结果
        return ldapTemplate.search("""(&(objectclass=person)(uid=" + uid
                
+ "))", createSearchControls(scope),
                
new LdapObjectAttributesMapper());
    }


    
/**
     * 查询包含当前Cn信息的所有用户,*代表任意长度的任意字符
     * 
     * 
     * 
@param cn
     *            用户的cn
     * 
@param scope
     *            取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,
     *            SUBTREE_SCOPE三个查询范围,分别代表 当前对象查询、当前节点下对象查询、当前节点所有子目录查询
     * 
     * 
@return 用户列表
     
*/

    
public List getPersonByCn(String cn, int scope) {
        
// 使用ldapTemplate提供的接口查询,objectclass=person 表示对象为person的对象

        
// cn 和 objectclass 组成联合查询条件,两个同时满足的查询结果
        return ldapTemplate.search("",
                
"(&(objectclass=person)(cn=" + cn + "))",
                createSearchControls(scope), 
new LdapObjectAttributesMapper());
    }


    
/**
     * 
@param scope
     *            取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,
     *            SUBTREE_SCOPE三个查询范围,分别代表 当前对象查询、当前节点下对象查询、当前节点所有子目录查询
     * 
     * 
@return 返回查询控制器对象
     * 
     
*/

    
private SearchControls createSearchControls(int scope) {
        
// 查询控制类SearchControls设定查询范围
        SearchControls constraints = new SearchControls();
        constraints.setSearchScope(scope);
        
return constraints;
    }


    
/**
     * 使用LdapPersonInfo类对象实现复合查询,属性中可使用通配符*,*代表任意长度的任意字符
     * 
     * 
     * 
@param ldapPersonInfo
     *            查询条件
     * 
@param scope
     *            取值为0、1、2,分别对应 SearchControls 类 OBJECT_SCOPE, ONELEVEL_SCOPE,
     *            SUBTREE_SCOPE三个查询范围,分别代表 当前对象查询、当前节点下对象查询、当前节点所有子目录查询
     * 
     * 
@return 用户列表
     
*/

    
public List getPersonByPersonEnty(LdapPersonInfo ldapPersonInfo, int scope) {
        
// strb存储、组装查询条件集合

        StringBuffer strb 
= new StringBuffer("(&(objectclass=person)");
        
// uid 属性

        
if (ldapPersonInfo.getUid() != null && ldapPersonInfo.getUid() != ""{
            strb.append(
"(uid=" + ldapPersonInfo.getUid() + ")");
        }

        
// givenname 属性

        
if (ldapPersonInfo.getFirstName() != null
                
&& ldapPersonInfo.getFirstName() != ""{
            strb.append(
"(givenname=" + ldapPersonInfo.getFirstName() + ")");
        }

        
// sn 属性

        
if (ldapPersonInfo.getLastName() != null
                
&& ldapPersonInfo.getLastName() != ""{
            strb.append(
"(sn=" + ldapPersonInfo.getLastName() + ")");
        }

        
// cn 属性

        
if (ldapPersonInfo.getCn() != null && ldapPersonInfo.getCn().size() > 0{
            
for (int i = 0; i < ldapPersonInfo.getCn().size(); i++)
                strb.append(
"(cn=" + ldapPersonInfo.getCn().get(i) + ")");
        }

        
// telephonenumber 属性

        
if (ldapPersonInfo.getTelephone() != null
                
&& ldapPersonInfo.getTelephone() != ""{
            strb.append(
"(telephonenumber=" + ldapPersonInfo.getTelephone()
                    
+ ")");
        }

        
// facsimiletelephonenumber 属性

        
if (ldapPersonInfo.getFax() != null && ldapPersonInfo.getFax() != ""{
            strb.append(
"(facsimiletelephonenumber=" + ldapPersonInfo.getFax()
                    
+ ")");
        }

        
// mail 属性

        
if (ldapPersonInfo.getMail() != null && ldapPersonInfo.getMail() != ""{
            strb.append(
"(mail=" + ldapPersonInfo.getMail() + ")");
        }

        String filter 
= strb.append(")").toString();
        
return ldapTemplate.search("", filter, createSearchControls(scope),
                
new LdapObjectAttributesMapper());
    }


    
/**
     * 根据dn查找用户,dn为base dn 的相对dn.(若basedn为:dc=koal,dc=com,user
     * dn为:uid=123,dc=koal,dc=com,则此处只需要提供 123 作为参数)
     * 
     * 
@param dn
     *            相对base dn的dn参数
     * 
@return 用户信息
     
*/

    
public LdapPersonInfo getLdapObjectByDn(String dn) {
        
return (LdapPersonInfo) ldapTemplate.lookup(dn,
                
new LdapObjectAttributesMapper());
    }


    
/**
     * 登陆验证
     * 
     * 
@param userDn
     *            用户的user dn
     * 
@param password
     *            用户登陆密码
     * 
@return 登陆成功返回true,不成功返回false
     
*/

    
private boolean loginCheack(String userDn, String password) {
        
// 获取DirContext对象
        DirContext ctxs = ldapTemplate.getContextSource().getReadOnlyContext();
        
try {
            
// 组装登陆ldap需要的信息数据
            Hashtable ht = new Hashtable();
            
// 获取已有的登陆信息

            ht 
= (Hashtable) ctxs.getEnvironment();
            
// 设置用户
            ht.put(Context.SECURITY_PRINCIPAL, userDn);
            
// 设置用户登陆密码
            ht.put(Context.SECURITY_CREDENTIALS, password);
            
// 设置用户验证方式为simple
            ht.put(Context.SECURITY_AUTHENTICATION, "simple");
            
// 出现异常时表示用当前登陆人登陆失败

            DirContext c 
= new InitialDirContext(ht);
            c.close();
            
return true;
        }
 catch (Exception e) {
            
// e.printStackTrace();
            System.out.println("login false");
            
return false;
        }
 finally {
            
try {
                ctxs.close();
            }
 catch (Exception ie) {

            }

        }

    }


    
/**
     * 验证用户登陆
     * 
     * 
@param uid
     *            用户uid
     * 
@param password
     *            用户密码
     * 
     * 
@return 是否登陆成功
     
*/

    
public boolean userLogin(String uid, String password) {
        
// 获取用户id所在ldap中的user dn
        List dnlist = getUserDnByUid(uid);
        
// 根据查询到的所有dn遍历,检查是否某一user dn与用户密码可以登陆ldap
        for (int i = 0; i < dnlist.size(); i++{
            
if (loginCheack(dnlist.get(i).toString(), password) == true{
                
return true;
            }

        }

        
return false;
    }


    
/**
     * 查询用户user dn
     * 
     * 
@param uid
     *            用户uid
     * 
     * 
@return 用户dn列表,当前目录节点下可能存在多个相同uid的多个user dn
     
*/

    
public List getUserDnByUid(String uid) {
        
// 获取DirContext对象
        DirContext ctx = ldapTemplate.getContextSource().getReadOnlyContext();
        
// 存储用户dn
        ArrayList dn = new ArrayList();
        
try {
            SearchControls constraints 
= new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration en 
= ctx.search("""uid=" + uid, constraints);
            
// 查询所有用户

            
while (en != null && en.hasMoreElements()) {
                Object obj 
= en.nextElement();
                
if (obj instanceof SearchResult) {
                    SearchResult si 
= (SearchResult) obj;
                    
// 获取dn并添加到查询列表
                    si.getName();
                    Hashtable ht 
= new Hashtable();
                    
// 获取已有的登陆信息
                    ht = (Hashtable) ctx.getEnvironment();
                    
// 设置用户
                    String str = ht.get(this.BASEDN_KEY).toString();
                    dn.add(si.getName()
+","+str);
                }

            }

            ctx.close();
        }
 catch (Exception e) {
            e.printStackTrace();
            
try {
                ctx.close();
            }
 catch (Exception ee) {
                ee.printStackTrace();
            }

        }

        
return dn;
    }


    
/**
     * ldap用户信息数据填充类 将获取的属性信息封装为LdapObject对象
     * 
     
*/

    
private class LdapObjectAttributesMapper implements AttributesMapper {
        
public Object mapFromAttributes(Attributes attrs)
                
throws NamingException {
            LdapPersonInfo LdapObject 
= new LdapPersonInfo();
            
try {
                
// 获取并封装uid属性

                LdapObject.setUid((String) getAttribute(attrs, 
"uid"));
                
// 获取并封装givenname属性

                LdapObject.setFirstName((String) getAttribute(attrs,
                        
"givenname"));
                
// 获取并封装sn属性

                LdapObject.setLastName((String) getAttribute(attrs, 
"sn"));
                
// 获取并封装cn属性

                LdapObject.setCn(getMoreSameAttributes(attrs, 
"cn"));
                
// 获取并封装telephonenumber属性

                LdapObject.setTelephone((String) getAttribute(attrs,
                        
"telephonenumber"));
                
// 获取并封装facsimiletelephonenumber属性

                LdapObject.setFax((String) getAttribute(attrs,
                        
"facsimiletelephonenumber"));
                
// 获取并封装mail属性

                LdapObject.setMail((String) getAttribute(attrs, 
"mail"));
            }
 catch (NamingException n) {
                n.printStackTrace();
            }

            
// 返回封装后的用户对象
            return LdapObject;
        }


        
/**
         * 从属性列表中获取指定的属性
         * 
         * 
         * 
@param attrs
         *            属性列表
         * 
         * 
@param attrName
         *            需要获取的属性
         * 
         * 
@return 返回获取的属性值
         * 
         * 
@throws NamingException
         
*/

        
private String getAttribute(Attributes attrs, String attrName)
                
throws NamingException {
            Attribute attr 
= attrs.get(attrName);
            
// 若没有指定的属性返回空字符串

            
if (attr == null{
                
return "";
            }
 else {
                
return (String) attr.get();
            }

        }


        
/**
         * 从属性列表中获取指定的属性的所有属性值
         * 
         * 
         * 
@param attrs
         *            属性列表
         * 
         * 
@param attrName
         *            需要获取的属性
         * 
         * 
@return 返回获取的属性值
         * 
         * 
@throws NamingException
         
*/

        
private List getMoreSameAttributes(Attributes attrs, String attrName)
                
throws NamingException {

            Attribute attr 
= attrs.get(attrName);
            List elelist 
= new ArrayList();
            
// 若没有指定的属性返回null
            if (attr == null{
                
return null;
            }
 else {
                
// 获取当前属性的所有值,添加到返回列表中
                Enumeration ent = attr.getAll();
                
while (ent.hasMoreElements())
                    elelist.add(ent.nextElement().toString());
                
return elelist;
            }

        }

    }


    
private void dispPerson(LdapPersonInfo temp) {
        System.out.println(
"-----------------------------");
        System.out.println(
"User(uid: " + temp.getUid() + ") listing...");
        System.out.println(
"First Name: " + temp.getFirstName());
        System.out.println(
"Last Name: " + temp.getLastName());
        System.out.println(
"Common Name: " + temp.getCn());
        System.out.println(
"User ID: " + temp.getUid());
        System.out.println(
"E-Mail: " + temp.getMail());
        System.out.println(
"Phone: " + temp.getTelephone());
        System.out.println(
"Fax: " + temp.getFax());
        System.out.println(
"List completed.");
        System.out.println(
"-----------------------------n");
    }



}

posted @ 2013-09-27 10:13  狼里格朗  阅读(651)  评论(0编辑  收藏  举报