您当前的位置:首页 > 互联网教程

用java操作ldap是报错,求大神解救

发布时间:2025-05-22 19:15:39    发布人:远客网络

用java操作ldap是报错,求大神解救

一、用java操作ldap是报错,求大神解救

出自

===========================================================================

问题:创建新用户时出现数据后端异常

在 WebSphere Portal Express中,您可以设置密码的最短和最长长度。如果设置的密码长度与 LDAP服务器的策略不相同,则在创建用户时您可能会看到以下异常:

EJPSG0015E: Data Backend Problem com.ibm.websphere.wmm.exception.WMMSystemException:

The following Naming Exception occurred during processing:

"javax.naming.OperationNotSupportedException: [LDAP: error code 53- 0000052D:

SvcErr: DSID-031A0FBC, problem 5003(WILL_NOT_PERFORM), data 0

]; remaining name'cn=see1anna,cn=users,dc=wps510,dc=rtp,dc=raleigh,dc=ibm,dc=com';

resolved object com.sun.jndi.ldap.LdapCtx@7075b1b4".

原因:这是由于“密码不能满足密码策略的要求”导致

1.打开域安全策略-安全设置-账户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。/密码长度最小值:定义这个策略设置为0。

2.打开域控制器安全策略-安全设置-账户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。/密码长度最小值:定义这个策略设置为0。

3.最后运行刷新组策略命令为:gpupdate/force

===========================================================================

===========================================================================

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

原因:LdapContext在处理完上个环节被close(),LdapContext=null;

===========================================================================

javax.naming.NoPermissionException: [LDAP: error code 50- 00002098: SecErr: DSID-03150A45, problem 4003(INSUFF_ACCESS_RIGHTS), data 0

===========================================================================

javax.naming.NameAlreadyBoundException: [LDAP: error code 68- 00000524: UpdErr: DSID-031A0F4F, problem 6005(ENTRY_EXISTS), data 0

===========================================================================

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

1.cas机器A,A上a,b,c服务运行良好

2.website位于B机器,cas可以截获请求,跳转javax.net.ssl.SSLHandshakeException

将A上生生成的客户端密钥,导入B

sudo keytool-genkey-alias tomcat-keyalg RSA-keypass changeit-storepass changeit-keystore server.keystore-validity 3600

$ keytool-export-trustcacerts-alias tomcat-file server.cer-keystore server.keystore-storepass changeit

$ sudo keytool-import-trustcacerts-alias tomcat-file server.cer-keystore$JAVA_HOME/jre/lib/security/cacerts-storepass changeit

建立信任关系,客户,服务密钥,客户多处

===========================================================================

javax.naming.NamingException: [LDAP: error code 1- 00000000: LdapErr: DSID-0C090AE2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, vece

原因:新增域用户的时候,ctx没有绑定管理员用户

解决方法:ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser+"@"+ ldapProperty.getDomain());

ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);

==========================================================================

javax.naming.NoPermissionException: [LDAP: error code 50- 00000005: SecErr: DSID-03151E04, problem 4003(INSUFF_ACCESS_RIGHTS)

原因:新建域用户时候,ctx绑定到一个普通用户(该用户没有新建用户的权限)

解决方法:使用管理员用户进行绑定:

ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser+"@"+ ldapProperty.getDomain());

ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);

==========================================================================

javax.naming.directory.InvalidAttributeValueException: [LDAP: error code 19- 0000052D: AtrErr: DSID-03190F00,#1:

0: 0000052D: DSID-03190F00, problem 1005(CONSTRAINT_ATT_TYPE)

原因:这个最大的可能是不满足域安全策略:如密码复杂性、密码最短使用期限、强制密码历史。即长度、包含的字符、多久可以修改密码、是否可以使用历史密码等。

==========================================================================

javax.naming.NoPermissionException: [LDAP: error code 50- 00000005: SecErr: DSID-031A0F44, problem 4003(INSUFF_ACCESS_RIGHTS)

原因:这个是最初代码使用的replace操作,这个在AD里对应的是密码重设(普通用户默认没有这个权限,管理员可以操作),另外remove操作时提供的旧密码错误也可能报这个异常

12. RSA premaster secret error

==========================================================================

javax.naming.CommunicationException: simple bind failed: 172.18.20.4:636 [Root exception is javax.net.ssl.SSLKeyException: RSA premaster secret error]

原因:Tomcat配置的JDK与添加证书的的JDK不一致。如:证书存放路径为C:/Java/jdk1.6.0_10/jre/lib/cacerts而Tomcat配置的JDK为C:/Java/jre6,使得两者路径不一致,SSL验证的时候,找不到证书

13.No trusted certificate found

==========================================================================

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

原因:信任证书库文件路径不正确

解决方法:将正确工程中/WEB-INF/classes目录下

==========================================================================

javax.naming.AuthenticationException: [LDAP: error code 49- 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece

二、javax.naming.ldap简介

1、在Java编程中,javax.naming.ldap是一个重要的软件包,它专注于 LDAPv3(Lightweight Directory Access Protocol version 3)的扩展操作和控件的支持。这个包扩展了Java Naming and Directory Interface(JNDI)的功能,JNDI为Java应用程序提供了命名和目录服务,使其能够以一种通用的方式访问多种目录服务,无论它们是新部署的还是已存在的。

2、JNDI的设计目标是实现编程语言的独立性,这意味着开发者可以使用相同的方法和接口来操作各种不同的命名和目录服务,无需关注具体实现的细节。通过这种方式,应用程序和服务提供者可以更灵活地处理LDAPv3的特性,如扩展操作和控件,这些在RFC 2251规范中进行了详细定义。

3、核心接口LdapContext在javax.naming.ldap包中扮演着关键角色,它定义了一系列方法,这些方法使得在上下文中执行扩展操作和处理控件变得简单。通过LdapContext,开发者可以有效地利用这些功能,提升其应用程序与LDAPv3兼容服务的交互效率。

三、openldapJava 连接 openldap

1、在使用Java连接OpenLDAP时,需要编写相应的代码来实现与LDAP服务器的连接与认证。以下是一个实现示例,该代码通过使用Java的JNDI(Java Naming and Directory Interface)库来完成与OpenLDAP服务器的连接操作。

2、首先,引入必要的Java类库,包括`javax.naming.Context`、`javax.naming.directory.DirContext`、`javax.naming.directory.InitialDirContext`等。这些类提供了连接LDAP服务器、执行查询和操作目录的基本功能。

3、在示例代码中,我们创建了一个名为`LDAPTest`的类,其中包含一个`main`方法作为入口点。在`main`方法中,我们定义了几个变量和一个`Hashtable`实例`env`,用于存储连接OpenLDAP服务器所需的属性和参数。

4、- `root`:表示连接的根节点,这里是`o=tcl,c=cn`,用于指定LDAP服务器上的一个特定位置。

5、- `env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory")`:设置初始上下文工厂为`com.sun.jndi.ldap.LdapCtxFactory`,用于创建连接到LDAP服务器的上下文。

6、- `env.put(Context.PROVIDER_URL,"ldap://localhost/"+ root)`:指定连接到的LDAP服务器的URL,这里是本地主机,加上指定的根节点。

7、- `env.put(Context.SECURITY_AUTHENTICATION,"simple")`:设置认证类型为简单认证。

8、- `env.put(Context.SECURITY_PRINCIPAL,"cn=Manager,o=tcl,c=cn")`:指定认证的用户名,这里是`cn=Manager,o=tcl,c=cn`。

9、- `env.put(Context.SECURITY_CREDENTIALS,"secret")`:指定认证的密码,这里是`secret`。

10、接着,我们通过`env`创建一个`InitialDirContext`对象`ctx`,并尝试与OpenLDAP服务器建立连接。如果连接成功,程序将输出“认证成功”;如果连接失败或出现异常,程序将输出相应的错误信息。

11、为了确保程序的健壮性,代码还包含了异常处理机制。在连接操作成功后,通过`ctx.close()`方法关闭与LDAP服务器的连接,确保资源的正确释放。如果在关闭连接过程中出现异常,通过捕获`NamingException`并忽略该异常来保证程序的正常运行。

12、整个代码示例展示了如何使用Java的JNDI库连接到OpenLDAP服务器,并执行基本的认证操作。这为后续实现更复杂的功能(如查询目录、添加、修改或删除目录条目)打下了基础。