Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
LDAP v3协议使用SASL来支持可插拔的认证。这意味着LDAP客户端和服务器可以根据客户端和服务器所需的保护级别来配置和使用可能非标准和/或定制的认证机制。LDAP v2协议不支持SASL。
目前定义了几种SASL机制:
在上述列表中,流行的LDAP服务器(如Oracle、OpenLDAP和Microsoft)支持External、Digest-MD5和Kerberos V5。《RFC 2829》建议使用Digest-MD5作为LDAP v3服务器的强制默认机制。
这是一个用于查找LDAP服务器支持的SASL机制列表的简单程序
。
// 创建初始上下文 DirContext ctx = new InitialDirContext(); // 从根DSE中读取supportedSASLMechanisms属性 Attributes attrs = ctx.getAttributes( "ldap://localhost:389", new String[]{"supportedSASLMechanisms"});
运行此程序对支持External SASL机制的服务器进行测试时,会产生以下输出。
{supportedsaslmechanisms=supportedSASLMechanisms: EXTERNAL, GSSAPI, DIGEST-MD5}
要使用特定的SASL机制,可以在Context.SECURITY_AUTHENTICATION环境属性中指定其IANA注册的机制名称。还可以指定LDAP提供程序尝试的机制列表。这可以通过指定有序的以空格分隔的机制名称列表来完成。LDAP提供程序将使用它找到的第一个机制的实现。
下面是一个示例,要求LDAP提供程序尝试获取DIGEST-MD5机制的实现,如果不可用,则使用GSSAPI的实现。
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 GSSAPI");
您可以从应用程序的用户获取身份验证机制的列表。或者,您可以通过类似于之前显示的调用向LDAP服务器询问。LDAP提供程序本身不会向服务器查询此信息。它只是尝试定位和使用指定机制的实现。
平台中的LDAP提供程序内置支持外部,Digest-MD5和GSSAPI(Kerberos v5)SASL机制。您可以添加对其他机制的支持。
某些机制,如外部机制,不需要其他输入,仅凭机制名称即可进行身份验证。 External示例显示了如何使用External SASL机制。
大多数其他机制需要一些额外的输入。根据机制,输入类型可能会有所不同。以下是某些机制需要的常见输入。
如果程序(例如代理服务器)代表另一个实体进行身份验证,则身份验证ID可能与授权ID不同。使用Context.SECURITY_PRINCIPAL环境属性指定身份验证ID。它的类型为java.lang.String。
身份验证ID的密码/密钥通过使用Context.SECURITY_CREDENTIALS环境属性指定。它的类型为java.lang.String、char数组(char[])或byte数组(byte[])。如果密码是byte数组,则通过使用UTF-8编码将其转换为char数组。
如果已设置"java.naming.security.sasl.authorizationId"属性,则其值用作授权ID。其值必须为java.lang.String类型。默认情况下,空字符串用作授权ID,这将指示服务器从客户端的身份验证凭据中派生授权ID。
Digest-MD5示例显示了如何使用Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIALS属性进行Digest-MD5身份验证。
如果一个机制需要除了已经描述的以外的输入,那么你需要为该机制定义一个 回调 对象供其使用,你可以在 JNDI教程 中查看回调示例。本课程的下一部分将讨论如何使用SASL Digest-MD5身份验证机制。JNDI教程中还涵盖了 SASL策略、GSS API(Kerberos v5)和CRAM-MD5机制。