Class Krb5LoginModule

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

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

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

如果KerberosLoginModule 的配置条目中的选项storeKey设置为true,那么KerberosKeyKeyTab也会被添加到主体的私有凭据中。对于KerberosKey,主体的密钥将从用户的密码派生,而KeyTab是在useKeyTab设置为true时使用的keytab。KeyTab对象只能被指定的主体使用,除非主体值为“*”。

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

用户可以通过在配置条目中使用ticketCache选项来指定票据缓存的位置。

用户可以通过在配置条目中使用keyTab选项来指定keytab的位置。

可以通过在配置条目中使用principal选项来指定主体名称。主体名称可以是简单的用户名,也可以是服务名称,例如host/mission.eng.sun.com,或者“*”。主体还可以使用系统属性sun.security.krb5.principal来设置。在登录时会检查此属性。如果未设置此属性,则将使用配置中的主体名称。如果未设置主体属性且主体条目也不存在,则会提示用户输入名称。当设置了此属性并且useTicketCache设置为true时,只有属于该主体的TGT才会被使用。

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

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

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

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

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

当提供多种检索票据或密钥的机制时,首选顺序为:

  1. 票据缓存
  2. keytab
  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获取密钥或从共享状态获取密钥。将会发生配置错误。

 keyTab = <filename>  doNotPrompt = true
这是一个非法的组合,因为useKeyTab没有设置为true,但设置了keyTab。将会发生配置错误。

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

 useTicketCache = true  doNotPrompt = true
检查默认缓存中的TGT并将Subject填充为主体和TGT。如果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。如果TGT不可用,则使用keytab中的密钥执行与KDC的身份验证交换并获取TGT。主体将填充为主体和TGT。如果密钥不可用或无效,则认证将失败。

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

 useKeyTab = true  keyTab=<keytab filename>  principal = <principal name>  storeKey = true
将从keytab中检索主体的密钥。如果keytab中没有密钥,则用户将提示输入主体的密码。主体将填充为主体的密钥,无论是从keytab中获取还是从输入的密码派生而来。

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

 isInitiator = false  useKeyTab = true  keyTab = <keytabname>  storeKey = true  principal = *
接收器将是一个未绑定的接收器,并且可以作为任何主体,只要该主体在keytab中有密钥。

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

 isInitiator = false
配置为仅充当接收器,凭据不通过AS交换获取。对于接收器,将此值设置为false。对于发起者,不要将此值设置为false。

 isInitiator = true
配置为充当发起者,凭据通过AS交换获取。对于发起者,将此值设置为true,或者不设置此选项,此时将使用默认值(true)。
  • Constructor Details

    • Krb5LoginModule

      public Krb5LoginModule()
      创建一个Krb5LoginModule
  • Method Details

    • initialize

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

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

      public boolean commit() throws LoginException
      如果LoginContext的整体认证成功(相关的REQUIRED、REQUISITE、SUFFICIENT和OPTIONAL LoginModules都成功)。

      如果这个LoginModule自己的身份验证尝试成功(通过检索login方法保存的私有状态来检查),那么这个方法将Krb5PrincipalLoginModule中的Subject关联起来。它将Kerberos凭证添加到Subject的私有凭证集中。如果这个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
      返回:
      在所有情况下返回true,因为不应忽略这个LoginModule
      抛出:
      LoginException - 如果注销失败。