zoukankan      html  css  js  c++  java
  • 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");
        }



    }

  • 相关阅读:
    Android网页打开指定App
    使用Android Studio Gradle实现友盟多渠道打包
    Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
    Android使用Mob ShareSDK 分享不同平台
    Android布局优化之层级优化
    (Facebook开源项目)Fresco:一个新的Android图像处理类库
    关于Android开发的几点建议
    [AndroidTips]startService与bindService的区别
    基于HBase的手机数据备份系统 .
    MySQL在CenterOS和Ubuntu的安装
  • 原文地址:https://www.cnblogs.com/weipeng/p/3342242.html
Copyright © 2011-2022 走看看