免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9891 | 回复: 16
打印 上一主题 下一主题

[ldap] 一个LDAP应用的例子,在Sun ONE Directory Server 5.2上。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-06 21:23 |只看该作者 |倒序浏览
先说一下环境Win2000AdvancedServer + Sun ONE Directory Server 5.2 + JDK1.4.2
Directory Server, 和JDK可以到Sun的网站上去下载。
Directory Server的安装:
首先用鼠标右键单击我的电脑->属性->网络标识->属性
这里可以看到计算机名,我的计算机名为acer。
点击其他,将此计算机的主DNS后缀栏为输入com然后点击确定。
这是可以看到完整的计算机名称:acer.com。接下来重新启动计算机。
启动完成后就可以安装Directory Server了。

以下是安装过程中我的Directory Server的一些配置。
Fully Qualified Computer Name: acer.com

Server Identifier: acer
Server Port: 64150
Suffix: dc=com

admin id: admin
admin pwd: admin

Administration Domain: com

Directory Manager Settings:
Directory Manager DN: cn=Directory Manager
pwd: manager
Administration Port: 64151

到此完成了基本的配置。

论坛徽章:
0
2 [报告]
发表于 2005-11-06 21:37 |只看该作者

程序1

从管理界面打开Directory Server的Directory当要创建用户时你会发现有这样几个属性:
必选属性:First Name,Last Name,Common Name(s)
可选属性:User ID,Password,E-Mail,Phone,Fax。
我主要根据这些属性来编写。

//LDAPTest.java

import java.util.*;

import javax.naming.*;
import javax.naming.directory.*;

public final class LDAPTest {

        private DirContext ctx;
        private Hashtable env;
       
        //服务器地址
        private static final String LDAP_URL =
                "ldap://localhost:64150";
        //管理域的dn
        private static final String MANAGER_DN =
                "cn=Directory Manager";
        //管理域的密码
        private static final String MANAGER_PASSWORD =
                "manager";
        //管理域的验证方式
        private static final String AUTH_TYPE =
                "simple";
        //
        private static final String CONTEXT_FACTORY =
                "com.sun.jndi.ldap.LdapCtxFactory";
        //用于测试的用户组的DN
        private static final String BASE_DN =
                "cn=student,ou=People,dc=com";
       
        //构造函数用于初始化ldap连接和创建用于测试的用户组
        public LDAPTest()
        throws NamingException {
                setEnvironment();
                ctx = new InitialDirContext(env);
                createGroup();
        }
       
        //设置登录到LDAP服务器的信息
        private void setEnvironment() {
                env = new Hashtable();
                env.put(Context.INITIAL_CONTEXT_FACTORY,
                        CONTEXT_FACTORY);
                env.put(Context.PROVIDER_URL,
                        LDAP_URL);
                env.put(Context.SECURITY_AUTHENTICATION,
                        AUTH_TYPE);
                env.put(Context.SECURITY_PRINCIPAL,
                        MANAGER_DN);
                env.put(Context.SECURITY_CREDENTIALS,
                        MANAGER_PASSWORD);
        }
       
        //创建一个用于测试的用户组(当用户组不存在时创建)
        private void createGroup()
        throws NamingException {
                try {
                        Attributes attr = ctx.getAttributes(BASE_DN);
                } catch (NamingException ne) {
                        Attribute objclass = new BasicAttribute("objectclass");
                        objclass.add("top");
                        objclass.add("groupofuniquenames");

                        Attribute cn = new BasicAttribute("cn", "student");

                        Attributes attrs = new BasicAttributes();
                        attrs.put(objclass);
                        attrs.put(cn);
       
                        ctx.bind(BASE_DN, null, attrs);
                        System.out.println("Group created.n");
                }
        }
       
        //关闭到LDAP服务器的连接
        private void closeConnection() {
                try {
                        ctx.close();
                } catch (NamingException ne) {
                        System.out.println(ne);
                }
        }
       
        //验证用户是否存在
        private boolean isUserexist(String uid) {
                try {
                        Attributes attrs = findUser(uid);
                        if (attrs != null) { return true; }
                        else { return false; }
                } catch (NamingException ne) {
                        return false;
                }
        }
       
        //设置属性
        private void putAttribute(Attributes attrs,
                String attrName, String attrValue) {
                if (attrValue != null && attrValue.length() != 0) {
                        Attribute attr =
                                new BasicAttribute(attrName, attrValue);
                        attrs.put(attr);
                }
        }
       
        //得到属性
        private String getAttribute(
                Attributes attrs, String attrName)
        throws NamingException {
                Attribute attr = attrs.get(attrName);
                if (attr == null) { return ""; }
                else { return (String)attr.get(); }
        }
       
        //查找用户
        private Attributes findUser(String uid)
        throws NamingException {
                return ctx.getAttributes("uid=" + uid + "," + BASE_DN);
        }
       
        //创建用户
        public void createUser(UserInformationObject userobj)
        throws NamingException {
                //用户对象为空
                if (userobj == null) {
                        throw new NamingException("No user informationn");
                }
               
                //检查uid
                String uid = userobj.
                        getProperty(UserInformationObject.USER_ID);
                if (uid == null && uid.length() == 0) {
                        throw new NamingException("No uid you specifyn");
                }
                if (isUserexist(uid)) {
                        throw new NamingException("The user(uid: " + uid +
                                ") is exist!n");
                }
               
                //检查firstName
                String firstName = userobj.
                        getProperty(UserInformationObject.FIRST_NAME);
                if (firstName == null || firstName.length() == 0) {
                        throw new NamingException("No first name you specify!n");
                }
               
                //检查lastName
                String lastName = userobj.
                        getProperty(UserInformationObject.LAST_NAME);
                if (lastName == null || lastName.length() == 0) {
                        throw new NamingException("No last name you specify!n");
                }
               
                //检查commonName
                String commonName = userobj.
                        getProperty(UserInformationObject.COMMON_NAME);
                if (commonName == null || commonName.length() == 0) {
                        throw new NamingException("No common name you specify!n");
                }
               
                String password = userobj.
                        getProperty(UserInformationObject.PASSWORD);
                String email = userobj.
                        getProperty(UserInformationObject.EMAIL);
                String phone = userobj.
                        getProperty(UserInformationObject.PHONE);
                String fax = userobj.
                        getProperty(UserInformationObject.FAX);
               
                Attributes attrs = new BasicAttributes();
               
                //设置属性
                Attribute objclass = new BasicAttribute("objectclass");
                objclass.add("top");
                objclass.add("person");
                objclass.add("organizationalPerson");
                objclass.add("inetorgperson");
                attrs.put(objclass);
               
                putAttribute(attrs, "cn", commonName);
                putAttribute(attrs, "givenname", firstName);
                putAttribute(attrs, "sn", lastName);
                putAttribute(attrs, "uid", uid);
                putAttribute(attrs, "userpassword", password);
                putAttribute(attrs, "mail", email);
                putAttribute(attrs, "telephonenumber", phone);
                putAttribute(attrs, "facsimiletelephonenumber", fax);
               
                //添加用户节点
                ctx.bind("uid=" + uid + "," + BASE_DN, null, attrs);
               
                System.out.println("User(uid: " + uid + ") created.n");
               
        }
       
        //修改用户信息
        public void modifyUser(UserInformationObject userobj)
        throws NamingException {
                //用户对象为空
                if (userobj == null) {
                        throw new NamingException("No user information!n");
                }
                //检查uid
                String uid = userobj.
                        getProperty(UserInformationObject.USER_ID);
                if (uid == null && uid.length() == 0) {
                        throw new NamingException("No uid you specify!n");
                }
                if (!isUserexist(uid)) {
                        throw new NamingException("The user(uid: " + uid
                                + ") does not exist!n");
                }
               
                int size = userobj.size();   //用户属性的个数
               
                //如果属性个数只有一个,那么只设置了uid,不用修改用户属性
                if (size > 1) {  
                        String password = userobj.
                                getProperty(UserInformationObject.PASSWORD);
                        String email = userobj.
                                getProperty(UserInformationObject.EMAIL);
                        String phone = userobj.
                                getProperty(UserInformationObject.PHONE);
                        String fax = userobj.
                                getProperty(UserInformationObject.FAX);
                        String commonName = userobj.
                                getProperty(UserInformationObject.COMMON_NAME);
                        String firstName = userobj.
                                getProperty(UserInformationObject.FIRST_NAME);
                        String lastName = userobj.
                                getProperty(UserInformationObject.LAST_NAME);
                       
                        //设置属性
                        Attributes attrs = new BasicAttributes();
                        putAttribute(attrs, "cn", commonName);
                        putAttribute(attrs, "givenname", firstName);
                        putAttribute(attrs, "sn", lastName);
                        putAttribute(attrs, "userpassword", password);
                        putAttribute(attrs, "mail", email);
                        putAttribute(attrs, "telephonenumber", phone);
                        putAttribute(attrs, "facsimiletelephonenumber", fax);
                       
                        //修改属性
                        ctx.modifyAttributes("uid=" + uid + "," + BASE_DN,
                                DirContext.REPLACE_ATTRIBUTE, attrs);

                        System.out.println("User(uid: " + uid +
                                ") information modified.n");
                } else {
                        throw new NamingException(
                                "No modify information you specify!n");
                }
        }
       
        //删除用户
        public void deleteUser(String uid)
        throws NamingException {
                if (!isUserexist(uid)) {
                        throw new NamingException("The user(uid: " + uid +
                                ") does not exist!n");
                }
                ctx.destroySubcontext(
                        "uid=" + uid + "," + BASE_DN);
                System.out.println("User(uid: " + uid + ") deleted.n");
        }
       
        //根据提供的uid察看用户的信息
        public void selectUser(String uid)
        throws NamingException {
                Attributes attrs;
                System.out.println("select user(uid: " + uid + ")...");
                try {
                        attrs = findUser(uid);
                        System.out.println("-----------------------------");
                        System.out.println("User(uid: " + uid + ") listing...");
                       
                        System.out.println("First Name: " +
                                getAttribute(attrs, "givenname"));
                        System.out.println("Last Name: " +
                                getAttribute(attrs, "sn"));
                        System.out.println("Common Name: " +
                                getAttribute(attrs, "cn"));
                        System.out.println("User ID: " +
                                getAttribute(attrs, "uid"));
                        System.out.println("E-Mail: " +
                                getAttribute(attrs, "mail"));
                        System.out.println("Phone: " +
                                getAttribute(attrs, "telephonenumber"));
                        System.out.println("Fax: " +
                                getAttribute(attrs, "facsimiletelephonenumber"));
                        System.out.println("List completed.");
                        System.out.println("-----------------------------n");
                } catch (NamingException ne) {
                        throw new NamingException("The user(uid: " + uid
                                + ") is not exist!n");
                }
        }
       
        //提供一个存有多个用户信息的数组查询多个用户
        public void selectUser(String[] uid) {
                for (int i = 0; i < uid.length; i++) {
                        try {
                                selectUser(uid[i]);
                        } catch (NamingException ne) {
                                System.out.println(ne);
                                continue;
                        }
                }
        }
       
        protected void finalize() {
                closeConnection();
        }
       
}

论坛徽章:
0
3 [报告]
发表于 2005-11-06 21:42 |只看该作者

程序2

用于存放用户属性的类
//UserInformationObject.java


import java.util.Properties;

public final class UserInformationObject {
       
        public static final String FIRST_NAME = "1";
        public static final String LAST_NAME = "2";
        public static final String COMMON_NAME = "3";
        public static final String USER_ID = "4";
        public static final String PASSWORD = "5";
        public static final String EMAIL = "6";
        public static final String PHONE = "7";
        public static final String FAX = "8";
       
        private Properties props;
       
        //防止使用默认的构造函数
        private UserInformationObject() {
               
        }
       
        //用于创建用户时使用
        public UserInformationObject(
                String firstName, String lastName,
                        String commonName, String userid) {
                props = new Properties();
                props.setProperty(FIRST_NAME, firstName);
                props.setProperty(LAST_NAME, lastName);
                props.setProperty(COMMON_NAME, commonName);
                props.setProperty(USER_ID, userid);
        }
       
        //用于修改用户信息时使用
        public UserInformationObject(String userid) {
                props = new Properties();
                props.setProperty(USER_ID, userid);
        }
       
        //设置First Name
        public void setFirstname(String firstName) {
                props.setProperty(FIRST_NAME, firstName);
        }
       
        //设置Last Name
        public void setLastname(String lastName) {
                props.setProperty(LAST_NAME, lastName);
        }
       
        //设置Common Name
        public void setCommonname(String commonName) {
                props.setProperty(COMMON_NAME, commonName);
        }
       
        //设置Password
        public void setPassword(String password) {
                props.setProperty(PASSWORD, password);
        }
       
        //设置E-Mail
        public void setEmail(String email) {
                props.setProperty(EMAIL, email);
        }
       
        //设置Phone
        public void setPhone(String phone) {
                props.setProperty(PHONE, phone);
        }
       
        //设置Fax
        public void setFax(String fax) {
                props.setProperty(FAX, fax);
        }
       
        //根据属性名得到属性的值
        public String getProperty(String propertyName) {
                return props.getProperty(propertyName);
        }
       
        //存储属性的个数
        public int size() {
                return props.size();
        }
}

[ 本帖最后由 national 于 2005-11-6 21:44 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2005-11-06 21:52 |只看该作者

程序3

用于测试的程序

//Test.java

public class Test {
        public static void main(String[] args) {
               
                //初始化用户
                UserInformationObject zhangsan =
                        new UserInformationObject(
                                "zhang", "san", "zhang san", "zhangsan");
                UserInformationObject lisi =
                        new UserInformationObject(
                                "li", "si", "li si", "lisi");
               
                //设置用户属性
                zhangsan.setPassword("abcdef");
                zhangsan.setPhone("02866666666");
                zhangsan.setEmail("zhangsan@163.com");
                zhangsan.setFax("02887654321");
               
                lisi.setPassword("fedcba");
                lisi.setPhone("02888888888");
                lisi.setEmail("lisi@163.com");
                lisi.setFax("02812345678");
               
                try {
                        LDAPTest ldap = new LDAPTest();
                        //创建用户
                        ldap.createUser(zhangsan);
                        ldap.createUser(lisi);
                       
                        String[] user = {"wangwu", "zhangsan", "lisi", "zhaoliu"};
                        //察看用户信息
                        ldap.selectUser(user);
                       
                        zhangsan.setPhone("02811111111");
                        zhangsan.setEmail("ldap@163.com");
                        //修改用户
                        ldap.modifyUser(zhangsan);  
                       
                        //察看用户信息
                        ldap.selectUser("zhangsan");
                       
                        //删除用户
                        ldap.deleteUser("lisi");
                       
                        //察看用户信息
                        ldap.selectUser(user);

                } catch (Exception e) {
                        System.out.println(e);
                }
        }
}

论坛徽章:
0
5 [报告]
发表于 2005-11-06 22:20 |只看该作者

结束

这只是个简单的用Java编写的针对LDAP应用的示例,有很多地方还没有涉及。比如,在这个例子中没有包括怎样查询过滤的信息。

应该注意LDAP的登录方式:
sasl_mech,none,simple。这个例子中使用的是simple,并登录到管理的DN。

以下是节点的类型的object class需要设置的属性
目录的object class:
top
domain
组织单元的object class:
top
organizationalunit
用户组的object class:
top
groupofuniquenames
用户的object class:
top
person
organizationalPerson
inetorgperson

论坛徽章:
0
6 [报告]
发表于 2005-11-08 13:20 |只看该作者
好东东!!

论坛徽章:
0
7 [报告]
发表于 2005-11-10 13:02 |只看该作者

不要忘拉objectClass

初学者容易犯一个错误,就是在增加组,和用户,组织
这些节点信息时容易只增加业务信息
什么意思
也许你增加一个用户
你把workphone,cn(全名),sex,address
都设好拉
可是一执行代码偏偏报告"schemaviolation'的错误
想拉半天,不会啊,也许是requried属性没加于是又加上
那些required属性,可还是报告"schemaviolation'的错误
其实就是objectClass没加
我门用惯拉数据库的增加方式:em11:
它那就只用关心实际的业务,不会让你去当心什么yig
objectClass这样一个系统属性

所以学的时候虽然知道有objectClass这个东东
可是一用起来还是用操作数据库的思维在行事
这应该也是一个小小的注意点把

论坛徽章:
0
8 [报告]
发表于 2005-11-10 18:43 |只看该作者
jayli426:
你用的LDAP服务器是Sun ONE Directory Server 5.2吗?检查一下你的环境吧。
我用我们寝室其他的机子将代码粘回来并运行都是正确的(没有用我写的源文件),这些代码是经过了多台机子的测试的。

关于设置objectClass属性在源代码的地方。
这是设置用户的objectClass
//设置属性
Attribute objclass = new BasicAttribute("objectclass");
objclass.add("top");
objclass.add("person");
objclass.add("organizationalPerson");
objclass.add("inetorgperson");
attrs.put(objclass);

在createGroup()有设置用户组的objectClass相应的代码。
这些应该很好找吧。

论坛徽章:
0
9 [报告]
发表于 2005-11-10 18:53 |只看该作者

哈,我是说我的错误

不要生气啊,national
national要有一些 nationalism spirit啊
我是说我在使用LDAP时所犯的错误,不是你啊,你确实要比我要精细很多,佩服佩服
我是看拉你的代码,所以才记下自己的错误来纪念之

论坛徽章:
0
10 [报告]
发表于 2005-11-22 10:20 |只看该作者
真是太好了,感谢无私奉献.

问个问题,如何用uid从ldap中获取用户密码 来验证用户的登陆?

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP