类 Krb5LoginModule

java.lang.Object
com.sun.security.auth.module.Krb5LoginModule
所有已实现的接口:
LoginModule

public class Krb5LoginModule extends Object implements LoginModule
LoginModule 使用 Kerberos 协议对用户进行身份验证。

Krb5LoginModule 的配置条目有几个选项,用于控制身份验证过程和对 Subject 的私有凭证集的添加。无论这些选项如何,Subject 的主体集和私有凭证集仅在调用 commit 时更新。当调用 commit 时,KerberosPrincipal 被添加到 Subject 的主体集(除非 principal 被指定为“*”)。如果 isInitiator 为真,则 KerberosTicket 将添加到 Subject 的私有凭证中。

如果 KerberosLoginModule 的配置条目将选项 storeKey 设置为 true,则 KerberosKeyKeyTab 也将添加到主体的私人凭证中。 KerberosKey ,主体的密钥将从用户的密码派生,而 KeyTabuseKeyTab 设置为 true 时使用的密钥表。 KeyTab 对象仅限于指定主体使用,除非主体值为“*”。

这个 LoginModule 识别 doNotPrompt 选项。如果设置为 true,则不会提示用户输入密码。

用户可以使用配置条目中的选项 ticketCache 指定票证缓存的位置。

用户可以使用配置条目中的选项 keyTab 指定密钥表位置。

可以使用选项 principal 在配置条目中指定主体名称。主体名称可以是简单的用户名、服务名称(例如 host/mission.eng.sun.com )或“*”。也可以使用系统属性 sun.security.krb5.principal 设置委托人。在登录期间检查此属性。如果未设置此属性,则使用配置中的主体名称。如果未设置主体属性且主体条目也不存在,则会提示用户输入名称。当条目的这个属性被设置,并且useTicketCache被设置为真时,只有属于这个主体的TGT被使用。

以下是 Krb5LoginModule 支持的配置选项列表:

refreshKrb5Config :
如果您希望在调用 login 方法之前刷新配置,请将其设置为 true。
useTicketCache :
如果您希望从票证缓存中获取 TGT,请将其设置为 true。如果您不希望此模块使用票证缓存,请将此选项设置为 false。 (默认为假)。此模块将在以下位置搜索票证缓存: 在 Linux 上,它将在 /tmp/krb5cc_uid 中查找票证缓存,其中 uid 是数字用户标识符。如果票证缓存在上述位置不可用,或者如果我们在 Windows 平台上,它将查找缓存作为 {user.home}{file.separator}krb5cc_{user.name}。您可以使用 ticketCache 覆盖票证缓存位置。对于 Windows,如果无法从文件票证缓存中检索到票证,它将使用本地安全机构 (LSA) API 来获取 TGT。
ticketCache :
将此设置为包含用户 TGT 的票证缓存的名称。如果设置了此项,useTicketCache 也必须设置为 true;否则将返回配置错误。
renewTGT :
将此设置为 true,如果你想在 TGT 超过一半过期时更新它(到期前的时间小于从开始时间开始的时间)。如果设置了此项,useTicketCache 也必须设置为 true;否则将返回配置错误。
doNotPrompt :
如果无法从缓存、keytab 或通过共享状态获取凭据,如果您不想被提示输入密码,请将此设置为 true。(默认为 false)如果设置为 true,则必须通过缓存获取凭据,密钥表或共享状态。否则,认证将失败。
useKeyTab :
如果您希望模块从密钥表中获取主体的密钥,请将其设置为 true。(默认值为 False)如果未设置 keytab,则模块将从 Kerberos 配置文件中查找密钥表。如果未在 Kerberos 配置文件中指定,则它将查找文件 {user.home}{file.separator} krb5.keytab。
keyTab :
将其设置为密钥表的文件名以获取主体的密钥。
storeKey :
如果您希望将密钥表或委托人的密钥存储在主题的私有凭证中,请将此设置为 true 。对于isInitiator为false,如果principal为“*”,存储的KeyTab 可以被任何人使用,否则,它被限制为只被指定的委托人使用。
principal :
应使用的委托人的名称。委托人可以是一个简单的用户名,例如“testuser”,也可以是一个服务名称,例如“host/testhost.eng.sun.com”。当 keyTab 中有多个委托人的凭据或者您只需要特定票证缓存时,您可以使用 principal 选项设置委托人。主体也可以使用系统属性 sun.security.krb5.principal 进行设置。此外,如果定义了此系统属性,则会使用它。如果未设置此属性,则将使用配置中的主体名称。当 isInitiator 为 false 时,主体名称可以设置为“*”。在这种情况下,接受者不绑定到单个委托人。如果可以找到该委托人的密钥,它可以充当发起者请求的任何委托人。当isInitiator为真时,主体名称不能设置为“*”。
isInitiator :
将此设置为 true,如果是发起者。如果仅接受器,则将其设置为 false。 (默认为真)。注意:对于启动器,请勿将此值设置为 false。

LoginModule 还识别以下附加 Configuration 选项,使您能够在不同的身份验证模块之间共享用户名和密码:

useFirstPass :
如果为真,此 LoginModule 使用“javax.security.auth.login.name”和“javax.security.auth.login.password”作为相应的键从模块的共享状态中检索用户名和密码。检索到的值用于身份验证。如果身份验证失败,则不会尝试重试,并将失败报告回调用应用程序。
tryFirstPass :
如果为真,此 LoginModule 使用“javax.security.auth.login.name”和“javax.security.auth.login.password”作为相应的键从模块的共享状态中检索用户名和密码。检索到的值用于身份验证。如果身份验证失败,模块将使用 CallbackHandler 检索新的用户名和密码,并再次尝试进行身份验证。如果身份验证失败,则将失败报告回调用应用程序
storePass :
如果为真,则此 LoginModule 使用“javax.security.auth.login.name”和“javax.security.auth.login.password”作为各自的键,将从 CallbackHandler 获得的用户名和密码存储在模块共享状态中。如果共享状态下的用户名和密码的现有值已经存在,或者身份验证失败,则不会执行此操作。
clearPass :
如果为真,则此 LoginModule 在身份验证的两个阶段(登录和提交)完成后清除存储在模块共享状态中的用户名和密码。

如果已经提供主体系统属性或密钥,则忽略共享状态中“javax.security.auth.login.name”的值。

当提供多种检索票证或密钥的机制时,优先顺序为:

  1. 门票缓存
  2. 密钥表
  3. 共享状态
  4. 用户提示

请注意,如果任何步骤失败,它将回退到下一步。只有一个例外,如果共享状态步骤失败并且出现 useFirstPass = true ,则不会出现用户提示。

JAAS 配置文件中 Krb5LoginModule 的一些配置值示例和结果如下:


 doNotPrompt = true 
这是非法组合,因为没有设置 useTicketCache, useKeyTab, useFirstPasstryFirstPass 并且无法提示用户输入密码。

 ticketCache = <filename> 
这是非法组合,因为 useTicketCache 未设置为 true 并且设置了 ticketCache。将发生配置错误。

 renewTGT = true 
这是非法组合,因为 useTicketCache 未设置为 true 并且设置了 renewTGT。将发生配置错误。

 storeKey = true useTicketCache = true doNotPrompt = true 
这是非法组合,因为 storeKey 设置为 true,但无法通过提示用户或从密钥表或共享状态获取密钥。将发生配置错误。

 keyTab = <filename> doNotPrompt = true 
这是非法组合,因为 useKeyTab 未设置为 true 并且设置了 keyTab。将发生配置错误。

 debug = true 
提示用户输入主体名称和密码。使用身份验证交换从 KDC 获取 TGT,并使用主体和 TGT 填充 Subject。输出调试信息。

 useTicketCache = true doNotPrompt = true 
检查 TGT 的默认缓存并使用主体和 TGT 填充 Subject。如果 TGT 不可用,则不提示用户,而是使身份验证失败。

 principal = <name> useTicketCache = true doNotPrompt = true 
从主体的默认缓存中获取 TGT,并填充主体的主体和私有信用集。如果票证缓存不可用或不包含主体的 TGT 身份验证将失败。

 useTicketCache = true
 ticketCache = <file name>
 useKeyTab = true
 keyTab = <keytab filename>
 principal = <principal name>
 doNotPrompt = true 
在缓存中搜索主体的 TGT。如果不可用,则使用密钥表中的密钥与 KDC 执行身份验证交换并获取 TGT。 Subject 将填充主体和 TGT。如果密钥不可用或无效,则身份验证将失败。

 useTicketCache = true ticketCache = <filename> 
TGT 将从指定的缓存中获取。使用的 Kerberos 主体名称将是票证缓存中的主体名称。如果 TGT 在票证缓存中不可用,系统将提示用户输入主体名称和密码。 TGT 将使用与 KDC 的身份验证交换获得。 Subject 将填充 TGT。

 useKeyTab = true keyTab=<keytab filename> principal = <principal name> storeKey = true 
主体的密钥将从密钥表中检索。如果密钥在密钥表中不可用,系统将提示用户输入主体的密码。 Subject 将使用来自密钥表或从输入的密码派生的委托人密钥填充。

 useKeyTab = true keyTab = <keytabname> storeKey = true doNotPrompt = false 
系统将提示用户输入服务主体名称。如果主体的长期密钥在 keytab 中可用,它将被添加到主体的私有凭证中。将尝试使用主体名称和 Keytab 中的密钥进行身份验证交换。如果成功,TGT 将被添加到主题的私有凭证集中。否则认证将失败。

 isInitiator = false useKeyTab = true keyTab = <keytabname> storeKey = true principal = * 
接受者将是一个未绑定的接受者,它可以充当任何委托人,只要该委托人在密钥表中有密钥。

 useTicketCache = true
 ticketCache = <file name>
 useKeyTab = true
 keyTab = <file name>
 storeKey = true
 principal = <principal name> 
客户端的 TGT 将从票证缓存中检索并添加到 Subject 的私有凭证中。如果 TGT 在票证缓存中不可用,或者 TGT 的客户端名称与主体名称不匹配,Java 将使用密钥使用身份验证交换获取 TGT,并将其添加到 Subject 的私有凭证中。该秘密密钥将首先从密钥表中检索。如果密钥不可用,系统将提示用户输入密码。在任何一种情况下,从密码派生的密钥都将添加到主题的私有凭证集中。

 isInitiator = false 
配置为仅充当接受者,不通过 AS 交换获取凭据。仅对于接受器,将此值设置为 false。对于启动器,请勿将此值设置为 false。

 isInitiator = true 
配置为启动器,凭证通过 AS 交换获取。对于启动器,将此值设置为 true,或不设置此选项,在这种情况下将使用默认值 (true)。
  • 构造方法详细信息

    • Krb5LoginModule

      public Krb5LoginModule()
      创建一个 Krb5LoginModule
  • 方法详情

    • initialize

      public void initialize(Subject  subject, CallbackHandler  callbackHandler, Map <String ,?> sharedState, Map <String ,?> options)
      初始化这个 LoginModule
      指定者:
      initialize 在接口 LoginModule
      参数:
      subject - 要验证的 Subject
      callbackHandler - 一个 CallbackHandler 用于与最终用户通信(例如,提示输入用户名和密码)。
      sharedState - 共享 LoginModule 状态。
      options - 在登录 Configuration 中为此特定的 LoginModule 指定的选项。
    • login

      public boolean login() throws LoginException
      验证用户
      指定者:
      login 在接口 LoginModule
      返回:
      在所有情况下都为真,因为不应忽略此 LoginModule
      抛出:
      FailedLoginException - 如果身份验证失败。
      LoginException - 如果此 LoginModule 无法执行身份验证。
    • commit

      public boolean commit() throws LoginException
      如果 LoginContext 的整体身份验证成功(相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 成功),则调用此方法。

      如果此 LoginModule 自己的身份验证尝试成功(通过检索 login 方法保存的私有状态进行检查),则此方法将 Krb5Principal 与位于 LoginModule 中的 Subject 相关联。它将 Kerberos 凭据添加到主题的私有凭据集中。如果此 LoginModule 自己的身份验证尝试失败,则此方法会删除最初保存的所有状态。

      指定者:
      commit 在接口 LoginModule
      返回:
      如果此 LoginModule 自己的登录和提交尝试成功,则为 true,否则为 false。
      抛出:
      LoginException - 如果提交失败。
    • abort

      public boolean abort() throws LoginException
      如果 LoginContext 的整体身份验证失败,则调用此方法。 (相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 没有成功)。

      如果此 LoginModule 自己的身份验证尝试成功(通过检索 logincommit 方法保存的私有状态进行检查),则此方法会清除最初保存的任何状态。

      指定者:
      abort 在接口 LoginModule
      返回:
      如果此 LoginModule 自己的登录和/或提交尝试失败,则为 false,否则为 true。
      抛出:
      LoginException - 如果中止失败。
    • logout

      public boolean logout() throws LoginException
      注销用户。

      此方法删除由 commit 方法添加的 Krb5Principal

      指定者:
      logout 在接口 LoginModule
      返回:
      在所有情况下都为真,因为不应忽略此 LoginModule
      抛出:
      LoginException - 如果注销失败。