java对Ldap操作.docx

上传人:b****6 文档编号:4295565 上传时间:2022-11-29 格式:DOCX 页数:14 大小:17.81KB
下载 相关 举报
java对Ldap操作.docx_第1页
第1页 / 共14页
java对Ldap操作.docx_第2页
第2页 / 共14页
java对Ldap操作.docx_第3页
第3页 / 共14页
java对Ldap操作.docx_第4页
第4页 / 共14页
java对Ldap操作.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

java对Ldap操作.docx

《java对Ldap操作.docx》由会员分享,可在线阅读,更多相关《java对Ldap操作.docx(14页珍藏版)》请在冰豆网上搜索。

java对Ldap操作.docx

java对Ldap操作

java对Ldap操作

{

    /** *//**

     * 定义使用springframework对ldap的访问操作对象 借助LdapTemplate可以实现大部分对ldap的操作

     */

    private LdapTemplate ldapTemplate;

    /** *//**

     * @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<String> getAllPersonNames(int scope, boolean distinct) ...{

        // 存储查询结果的集合

        final ArrayList<String> allPersonCnList = new ArrayList<String>();

        // 使用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<String> templist = new ArrayList<String>();

            for (String cn :

 allPersonCnList)

                if (!

templist.contains(cn)) ...{

                    templist.add(cn);

                }

            // 返回无重复值的结果

            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<Object, Object> ht = new Hashtable<Object, Object>();

            // 获取已有的登陆信息

            ht = (Hashtable<Object, Object>) 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 (Object dn :

 dnlist) ...{

            if (loginCheack(dn.toString(), password) == true) ...{

                return true;

            }

        }

        return false;

    }

    /** *//**

     * 查询用户user dn

     * 

     * @param uid

     *            用户uid

     * 

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

     */

    public List<String> getUserDnByUid(String uid) ...{

        // 获取DirC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1