- 浏览: 21810 次
最新评论
java 通过LDAP 验证、添加、修改、删除
1. 域服务器(dc=dctest,dc=com),安装证书服务,创建企业根证书,名称为dctest.com
则:cn=dctest.com,dc=dctest,dc=com
2. 申请证书类型域控制器的证书
3. 将企业根证书和域控制器证书导入到应用服务器cacerts
4. 在应用程序中,编写代码引用cacerts认证。
keytool
- packagebof.usermanager.auth.impl;
- importjava.io.IOException;
- importjava.util.ArrayList;
- importjava.util.List;
- importjava.util.Properties;
- importjavax.naming.AuthenticationException;
- importjavax.naming.Context;
- importjavax.naming.NamingEnumeration;
- importjavax.naming.NamingException;
- importjavax.naming.directory.Attribute;
- importjavax.naming.directory.Attributes;
- importjavax.naming.directory.BasicAttribute;
- importjavax.naming.directory.BasicAttributes;
- importjavax.naming.directory.DirContext;
- importjavax.naming.directory.ModificationItem;
- importjavax.naming.directory.SearchControls;
- importjavax.naming.directory.SearchResult;
- importjavax.naming.ldap.Control;
- importjavax.naming.ldap.InitialLdapContext;
- importjavax.naming.ldap.LdapContext;
- importcom.report.service.PropertyItem;
- importcom.report.vo.OrganizationalUnitDomain;
- importcom.report.vo.UserDomain;
- /**
- *功能:本操作类提供AD域用户的增、删、查、改功能
- *作者:陈艺武
- *日期:2010-4-13
- */
- publicclassLdapADManager{
- protectedDataSourceConnectLDAPVOtransientInstance=null;
- /**用户的objectClass*/
- privateStringdefault_objectclass="user";
- /**用户的默认根DN*/
- privateStringdefault_base="CN=Users,DC=all,DC=com";
- /**用户默认主键*/
- privateStringkey_index="CN";
- /**用户默认密码属性.*/
- privateStringpwd_index="unicodePwd";
- privateControl[]connCtls=null;
- privatestaticLdapADManagerLdapADManager=null;
- privateLdapADManager(){}
- publicstaticLdapADManagergetInstance(){
- if(LdapADManager==null)
- LdapADManager=newLdapADManager();
- returnLdapADManager;
- }
- /**
- *从连接池中获取一个连接.
- *
- *@returnLdapContext
- *@throwsNamingException
- */
- publicLdapContextgetConnectionFromFool()throwsNamingException{
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- Stringkeystore="c:/Java/jdk1.6.0_10/jre/lib/security/cacerts";
- System.setProperty("javax.net.ssl.trustStore",keystore);
- Propertiesenv=newProperties();
- env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
- env.put("com.sun.jndi.ldap.connect.pool","true");
- env.put(Context.SECURITY_AUTHENTICATION,"simple");
- env.put(Context.SECURITY_PROTOCOL,"ssl");
- //env.put("java.naming.referral","follow");
- env.put(Context.PROVIDER_URL,ldapProperty.getLdapURL());
- connCtls=newControl[]{newLdapADManagerControl()};
- returnnewInitialLdapContext(env,connCtls);
- }
- /**
- *功能:校验用户登录.
- *@paramuserName
- *@parampassword
- *@return
- *
- *作者:陈艺武
- *日期:Apr13,2010
- */
- publicbooleanauthenticate(StringuserName,Stringpassword){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- StringuserDn=userName+"@"+ldapProperty.getDomain();
- LdapContextctx=null;
- try{
- ctx=getConnectionFromFool();
- ctx.getRequestControls();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userDn);
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,password);
- ctx.reconnect(connCtls);
- returntrue;
- }catch(AuthenticationExceptione){
- e.printStackTrace();
- returnfalse;
- }catch(NamingExceptione){
- e.printStackTrace();
- returnfalse;
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
- /**
- *功能:获取AD用户列表
- *@return
- *
- *作者:陈艺武
- *日期:Apr12,2010
- */
- publicListlistUser(){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- Listlist=newArrayList();
- LdapContextctx=null;
- UserDomainuser=null;
- Stringbase="OU="+ldapProperty.getBase()+","+ldapProperty.getDomainDC();
- try{
- ctx=this.getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,ldapProperty.getUserName()+"@"+ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,ldapProperty.getPassWord());
- //base="OU=北京华融综合投资公司,DC=bjhr,DC=com,DC=cn";
- Stringfilter="(&(objectCategory=person)(objectClass=USER)(name=*))";
- SearchControlscontrols=newSearchControls();
- controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- //controls.setReturningAttributes(newString[]{"sAMAccountName","displayName","department"});
- controls.setReturningAttributes(newString[]{"sAMAccountName","cn"});
- NamingEnumeration<SearchResult>answer=ctx.search(base,filter,controls);
- while(answer.hasMore()){
- user=newUserDomain();
- SearchResultresult=answer.next();
- NamingEnumeration<?extendsAttribute>attrs=result.getAttributes().getAll();
- intcount=0;
- while(attrs.hasMore()){
- Attributeattr=attrs.next();
- if(count==0){
- user.setUserName(attr.get().toString());
- }else{
- user.setUserAliasName(attr.get().toString());
- }
- count++;
- }
- user.setNameSpace(ldapProperty.getDomain());
- list.add(user);
- }
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- returnlist;
- }
- /**
- *功能:查询组织单位列表
- *@paramouName
- *@return
- *
- *作者:陈艺武
- *日期:Apr13,2010
- *说明:base格式如:"OU=北京华融综合投资公司,DC=bjhr,DC=com,DC=cn";
- */
- publicListlistOrganizztionalUnit(StringouName){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- Listlist=newArrayList();
- LdapContextctx=null;
- OrganizationalUnitDomainouDomain=null;
- Stringbase="OU="+ldapProperty.getBase()+","+ldapProperty.getDomainDC();
- try{
- ctx=this.getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,ldapProperty.getUserName()+"@"+ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,ldapProperty.getPassWord());
- Stringfilter="(&(objectClass=organizationalUnit)";
- if(ouName!=null&&!ouName.equals(""))
- filter=filter+"(name=*"+ouName+"*)";
- filter=filter+")";
- SearchControlscontrols=newSearchControls();
- controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- controls.setReturningAttributes(newString[]{"name"});
- NamingEnumeration<SearchResult>answer=ctx.search(base,filter,controls);
- while(answer.hasMore()){
- ouDomain=newOrganizationalUnitDomain();
- SearchResultresult=answer.next();
- NamingEnumeration<?extendsAttribute>attrs=result.getAttributes().getAll();
- intcount=0;
- while(attrs.hasMore()){
- Attributeattr=attrs.next();
- if(count==0){
- ouDomain.setOuName(attr.get().toString());
- }
- count++;
- }
- list.add(ouDomain);
- }
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- returnlist;
- }
- /**
- *功能:添加用户
- *@paramou组织单位:中投证券,销售部门
- *@paramdepartment
- *@paramrealName真实姓名,如:李伟
- *@paramuserName用户名,如:administrator
- *@paramuserPwd
- *@paramadminUser
- *@paramadminPwd
- *@return
- *
- *作者:陈艺武
- *日期:Apr12,2010
- */
- publicbooleanaddUser(Stringou,Stringdepartment,StringrealName,StringuserName,StringadminUser,StringadminPwd){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- LdapContextctx=null;
- try{
- ctx=getConnectionFromFool();
- Attributesattrs=newBasicAttributes(true);
- Attributeobjclass=newBasicAttribute("objectclass");
- setObjectclassToAttribute(objclass);
- attrs.put(objclass);
- attrs.put("sAMAccountName",userName);
- attrs.put("cn",realName);
- intUF_ACCOUNTDISABLE=0x0002;
- intUF_PASSWD_NOTREQD=0x0020;
- intUF_NORMAL_ACCOUNT=0x0200;
- intUF_PASSWORD_EXPIRED=0x800000;
- attrs.put("userAccountControl",Integer.toString(UF_NORMAL_ACCOUNT+UF_PASSWD_NOTREQD+UF_PASSWORD_EXPIRED+UF_ACCOUNTDISABLE));
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,adminUser+"@"+ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,adminPwd);
- //StringnewUser="CN="+realName+","+cvtOuString(ou)+","+ldapProperty.getDomainDC();
- StringnewUser="CN="+realName+","+this.getFullOu(ctx,ou)+","+ldapProperty.getDomainDC();
- ctx.createSubcontext(newUser,attrs);
- ModificationItem[]mods=newModificationItem[2];
- StringnewQuotedPassword="/""+userName+"/"";
- byte[]newUnicodePassword=newQuotedPassword.getBytes("UTF-16LE");
- mods[0]=newModificationItem(DirContext.REPLACE_ATTRIBUTE,newBasicAttribute("unicodePwd",newUnicodePassword));
- mods[1]=newModificationItem(DirContext.REPLACE_ATTRIBUTE,newBasicAttribute("userAccountControl",Integer.toString(UF_NORMAL_ACCOUNT+UF_PASSWORD_EXPIRED)));
- ctx.modifyAttributes(newUser,mods);
- mods=null;
- returntrue;
- }catch(NamingExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- if(ctx!=null){
- try{
- ctx.close();
- }catch(NamingExceptione){
- e.printStackTrace();
- }
- ctx=null;
- }
- }
- returnfalse;
- }
- /**
- *功能:管理员用户初始化用户密码
- *@paramsUserName
- *@paramsNewPassword
- *@return
- *
- *作者:陈艺武
- *日期:Apr13,2010
- */
- publicbooleanadminChangePassword(StringadminUser,StringadminPwd,StringsUserName){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- LdapContextctx=null;
- //不能从应用中修改超级管理员密码
- if(sUserName!=null&&sUserName.equalsIgnoreCase("administrator"))
- returnfalse;
- try{
- ctx=getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,adminUser+"@"+ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,adminPwd);
- ModificationItem[]mods=newModificationItem[1];
- StringnewQuotedPassword="/""+sUserName+"/"";
- byte[]newUnicodePassword=newQuotedPassword.getBytes("UTF-16LE");
- mods[0]=newModificationItem(DirContext.REPLACE_ATTRIBUTE,newBasicAttribute("unicodePwd",newUnicodePassword));
- StringcnUser=getUser(ctx,sUserName)+","+ldapProperty.getDomainDC();
- ctx.modifyAttributes(cnUser,mods);
- returntrue;
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- returnfalse;
- }
- /**
- *功能:用户修改密码
- *@paramsUserName
- *@paramsOldPassword
- *@paramsNewPassword
- *@return
- *
- *作者:陈艺武
- *日期:Apr9,2010
- */
- publicbooleanuserChangePassword(StringsUserName,StringsOldPassword,StringsNewPassword){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- LdapContextctx=null;
- StringuserNameAndDomain=sUserName+"@"+ldapProperty.getDomain();
- //不能从应用中修改超级管理员密码
- if(sUserName!=null&&sUserName.equalsIgnoreCase("administrator"))
- returnfalse;
- try{
- ctx=getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userNameAndDomain);
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,sOldPassword);
- ModificationItem[]mods=newModificationItem[2];
- StringoldQuotedPassword="/""+sOldPassword+"/"";
- byte[]oldUnicodePassword=oldQuotedPassword.getBytes("UTF-16LE");
- StringnewQuotedPassword="/""+sNewPassword+"/"";
- byte[]newUnicodePassword=newQuotedPassword.getBytes("UTF-16LE");
- mods[0]=newModificationItem(DirContext.REMOVE_ATTRIBUTE,newBasicAttribute("unicodePwd",oldUnicodePassword));
- mods[1]=newModificationItem(DirContext.ADD_ATTRIBUTE,newBasicAttribute("unicodePwd",newUnicodePassword));
- StringcnUser=getUser(ctx,sUserName)+","+ldapProperty.getDomainDC();
- ctx.modifyAttributes(cnUser,mods);
- returntrue;
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- returnfalse;
- }
- /**
- *功能:修改用户信息
- *@paramattrs
- *@paramuserDN
- *@return
- *
- *作者:陈艺武
- *日期:Apr12,2010
- */
- publicbooleanmodify(Attributesattrs,StringuserDN){
- LdapContextctx=null;
- try{
- ctx=getConnectionFromFool();
- attrs.remove(key_index);
- ctx.modifyAttributes(userDN,DirContext.REPLACE_ATTRIBUTE,attrs);
- returntrue;
- }catch(NamingExceptione){
- System.err.println("Problemchangingpassword:"+e);
- }catch(Exceptione){
- System.err.println("Problem:"+e);
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- returnfalse;
- }
- /**
- *功能:删除用户
- *@paramadminUser
- *@paramadminPwd
- *@paramuserDN用户登陆名
- *@return
- *
- *作者:陈艺武
- *日期:Apr12,2010
- */
- publicbooleandel(StringadminUser,StringadminPwd,StringuserName){
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- LdapContextctx=null;
- try{
- ctx=getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,adminUser+"@"+ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,adminPwd);
- StringadUser=getUser(ctx,userName)+","+ldapProperty.getDomainDC();
- ctx.destroySubcontext(adUser);
- returntrue;
- }catch(NamingExceptione){
- System.err.println("Problemchangingpassword:"+e);
- }catch(Exceptione){
- System.err.println("Problem:"+e);
- }finally{
- try{
- ctx.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- returnfalse;
- }
- privatevoidsetObjectclassToAttribute(Attributeobjclass){
- objclass.add("top");
- objclass.add("person");
- objclass.add("organizationalPerson");
- objclass.add("inetorgperson");
- }
- privateStringgetUser(LdapContextctx,Stringusr){
- StringuserName="";
- Stringfilter="sAMAccountName="+usr;
- SearchResultsi=getSearchResult(ctx,filter);
- if(si!=null)
- userName=si.getName();
- returnuserName;
- }
- privateStringgetFullOu(LdapContextctx,Stringou){
- StringuserName="";
- Stringfilter="(&(objectClass=organizationalUnit)(name="+ou+"))";
- SearchResultsi=getSearchResult(ctx,filter);
- if(si!=null)
- userName=si.getName();
- returnuserName;
- }
- privateSearchResultgetSearchResult(LdapContextctx,Stringfilter){
- SearchResultsi=null;
- PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
- try{
- SearchControlsconstraints=newSearchControls();
- co<mce:scripttype="text/javascript"src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:scripttype="text/javascript"src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>nstraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
- NamingEnumerationen=ctx.search(ldapProperty.getDomainDC(),filter,constraints);//查询所有用户
- while(en!=null&&en.hasMoreElements()){
- Objectobj=en.nextElement();
- if(objinstanceofSearchResult){
- si=(SearchResult)obj;
- break;
- }
- }
- }catch(NamingExceptionex){
- ex.printStackTrace();
- }
- returnsi;
- }
- }
- classLdapADManagerControlimplementsControl{
- publicbyte[]getEncodedValue(){
- returnnull;
- }
- publicStringgetID(){
- return"1.2.840.113556.1.4.1781";
- }
- publicbooleanisCritical(){
- returntrue;
- }
- }
相关推荐
Java 连接和验证 LDAP 文档 Java 连接和验证 LDAP 文档是一份关于 Java 语言连接和验证 LDAP 服务器的学习文档。LDAP(Lightweight Directory Access Protocol)是一种目录访问协议,用于管理和访问目录服务中的...
在Java中,我们可以使用各种库来实现与LDAP服务器的交互,这些库提供了丰富的API,使得开发人员能够轻松地进行查询、添加、删除和修改目录记录。本篇将详细介绍Java与LDAP的集成以及相关知识点。 1. LDAP简介: ...
这个API包含在Java的`javax.naming`和`javax.naming.ldap`包中,提供了丰富的类和接口,如`InitialLdapContext`、`NamingEnumeration`和`DirContext`等,使得开发者能够方便地执行LDAP操作,如查找、添加、删除和...
通过JNDI,开发者可以执行搜索、添加、删除和修改目录条目等操作。 3. **连接LDAP服务器**:使用JNDI建立到LDAP服务器的连接,需要配置初始上下文(Initial Context)并提供连接参数,如服务器地址、端口和安全设置...
- 成功后,`getCtx()`返回`DirContext`实例,可用于后续操作,如搜索、添加、修改或删除目录条目。 3. **关闭连接:**通过`closeCtx()`方法关闭与LDAP服务器的连接,释放资源,避免内存泄漏。 #### 密码处理技巧 ...
通过JNDI,我们可以执行查找、添加、删除和修改目录中的条目等操作。** **使用Java进行LDAP操作时,主要涉及以下几个步骤:** 1. **连接 LDAP 服务器**:首先,需要建立一个环境属性对象,并配置 LDAP 服务器的URL...
通过JNDI,Java开发者可以方便地与LDAP服务器进行交互,实现诸如连接、添加、删除、修改和搜索等操作。 1. **JNDI基础** JNDI是一个接口,提供了一种统一的方式来查找和管理各种命名和目录服务,包括 LDAP、DNS、...
**LDAP (轻量级目录访问协议) 是一种用于访问和管理分布式目录服务的标准协议,广泛应用于企业环境中的用户身份验证和授权。在Java中,我们可以使用JNDI(Java Naming and Directory Interface)来操作LDAP服务器,...
这个API是Java命名和目录接口(JNDI)的一部分,提供了一组类和接口,使得开发者可以方便地执行如搜索、添加、删除、修改和比较目录条目的操作。 **Java LDAP API组件** 1. **NamingContext**: 这是JNDI的核心接口...
4. **修改条目**:如果需要更新目录中的信息,可以使用`DirContext.modifyAttributes()`方法,传入DN和修改的操作(如添加、删除或替换属性)。 5. **创建和删除条目**:使用`DirContext.createSubcontext()`创建新...
- 单点登录(SSO):通过LDAP实现跨多个系统的统一身份验证。 - 系统配置管理:使用LDAP存储和分发系统配置信息,简化运维工作。 总结来说,LDAP是实现目录服务的关键协议,而活动目录是其在Windows环境中的具体...
同时,通过单元测试来验证LDAP操作的有效性也很重要。 总之,Spring LDAP 1.3.1为Java开发者提供了一种高效且易于使用的工具,以处理与LDAP服务器的交互。通过它的强大功能,开发者可以更加专注于业务逻辑,而无需...
总结,本文详细介绍了如何在CentOS上安装和配置LDAP服务器,以及如何使用Java通过JNDI接口访问LDAP数据。同时,还解释了LDIF文件的作用,并提供了导入数据的基本命令。通过这些知识,你可以构建和管理自己的LDAP目录...
3. 添加、修改和删除条目:开发包支持对目录中的条目执行CRUD操作。例如,可以创建新的用户账户,更新用户信息,或者删除不再需要的条目。 4. 绑定和解绑:LDAP协议基于认证的上下文操作,开发包提供了方便的方法...
LDAP操作主要包括bind(绑定)、search(搜索)、compare(比较)、delete(删除)、modify(修改)、add(添加)等。 **3. Java环境下的LDAP浏览器** 由于"LDAP Browser"是基于Java开发的,因此使用前需要确保...
类库通常包含了各种预定义的方法和函数,用于执行常见的LDAP操作,如搜索、添加、删除、修改条目,以及绑定和解绑到LDAP服务器。 ### 类库的核心功能 1. **连接与身份验证**:类库提供了连接到 LDAP 服务器的方法...
4. **编辑与管理**:用户可以添加、修改或删除LDAP条目,以及它们的属性和值。 5. **导入与导出**:方便地将目录数据导入或导出到文件,便于备份和迁移。 6. **日志记录与审计**:记录所有操作,以供审核和故障...
它可能包含连接LDAP服务器、执行搜索、添加、修改和删除条目的方法。同时,`LdapMd5.java`很可能包含了MD5加密的逻辑,比如一个`encryptPassword`方法,该方法接收明文密码,返回其MD5加密后的值。 在实际应用中,...
基于LDAP的用户验证是通过`LdapAuthenticationProvider`实现的,它是Spring Security的一部分。首先,配置`LdapAuthenticationProvider`,设置LDAP连接信息和用户搜索策略。然后,当用户尝试登录时,Spring Security...