- 所有已实现的接口:
LoginModule
LoginModule
使用 Kerberos 协议对用户进行身份验证。
Krb5LoginModule
的配置条目有几个选项,用于控制身份验证过程和对 Subject
的私有凭证集的添加。无论这些选项如何,Subject
的主体集和私有凭证集仅在调用 commit
时更新。当调用 commit
时,KerberosPrincipal
被添加到 Subject
的主体集(除非 principal
被指定为“*”)。如果 isInitiator
为真,则 KerberosTicket
将添加到 Subject
的私有凭证中。
如果 KerberosLoginModule
的配置条目将选项 storeKey
设置为 true,则 KerberosKey
或 KeyTab
也将添加到主体的私人凭证中。 KerberosKey
,主体的密钥将从用户的密码派生,而 KeyTab
是 useKeyTab
设置为 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”的值。
当提供多种检索票证或密钥的机制时,优先顺序为:
- 门票缓存
- 密钥表
- 共享状态
- 用户提示
请注意,如果任何步骤失败,它将回退到下一步。只有一个例外,如果共享状态步骤失败并且出现 useFirstPass = true
,则不会出现用户提示。
JAAS 配置文件中 Krb5LoginModule 的一些配置值示例和结果如下:
这是非法组合,因为没有设置doNotPrompt = true
useTicketCache, useKeyTab, useFirstPass
和tryFirstPass
并且无法提示用户输入密码。这是非法组合,因为ticketCache = <filename>
useTicketCache
未设置为 true 并且设置了 ticketCache。将发生配置错误。这是非法组合,因为renewTGT = true
useTicketCache
未设置为 true 并且设置了 renewTGT。将发生配置错误。这是非法组合,因为storeKey = true useTicketCache = true doNotPrompt = true
storeKey
设置为 true,但无法通过提示用户或从密钥表或共享状态获取密钥。将发生配置错误。这是非法组合,因为 useKeyTab 未设置为 true 并且设置了 keyTab。将发生配置错误。keyTab = <filename> doNotPrompt = true
提示用户输入主体名称和密码。使用身份验证交换从 KDC 获取 TGT,并使用主体和 TGT 填充debug = true
Subject
。输出调试信息。检查 TGT 的默认缓存并使用主体和 TGT 填充useTicketCache = true doNotPrompt = true
Subject
。如果 TGT 不可用,则不提示用户,而是使身份验证失败。从主体的默认缓存中获取 TGT,并填充主体的主体和私有信用集。如果票证缓存不可用或不包含主体的 TGT 身份验证将失败。principal = <name> useTicketCache = true doNotPrompt = true
在缓存中搜索主体的 TGT。如果不可用,则使用密钥表中的密钥与 KDC 执行身份验证交换并获取 TGT。 Subject 将填充主体和 TGT。如果密钥不可用或无效,则身份验证将失败。useTicketCache = true ticketCache = <file name> useKeyTab = true keyTab = <keytab filename> principal = <principal name> doNotPrompt = true
TGT 将从指定的缓存中获取。使用的 Kerberos 主体名称将是票证缓存中的主体名称。如果 TGT 在票证缓存中不可用,系统将提示用户输入主体名称和密码。 TGT 将使用与 KDC 的身份验证交换获得。 Subject 将填充 TGT。useTicketCache = true ticketCache = <filename>
主体的密钥将从密钥表中检索。如果密钥在密钥表中不可用,系统将提示用户输入主体的密码。 Subject 将使用来自密钥表或从输入的密码派生的委托人密钥填充。useKeyTab = true keyTab=<keytab filename> principal = <principal name> storeKey = true
系统将提示用户输入服务主体名称。如果主体的长期密钥在 keytab 中可用,它将被添加到主体的私有凭证中。将尝试使用主体名称和 Keytab 中的密钥进行身份验证交换。如果成功,TGT 将被添加到主题的私有凭证集中。否则认证将失败。useKeyTab = true keyTab = <keytabname> storeKey = true doNotPrompt = false
接受者将是一个未绑定的接受者,它可以充当任何委托人,只要该委托人在密钥表中有密钥。isInitiator = false useKeyTab = true keyTab = <keytabname> storeKey = true principal = *
客户端的 TGT 将从票证缓存中检索并添加到useTicketCache = true ticketCache = <file name> useKeyTab = true keyTab = <file name> storeKey = true principal = <principal name>
Subject
的私有凭证中。如果 TGT 在票证缓存中不可用,或者 TGT 的客户端名称与主体名称不匹配,Java 将使用密钥使用身份验证交换获取 TGT,并将其添加到 Subject 的私有凭证中。该秘密密钥将首先从密钥表中检索。如果密钥不可用,系统将提示用户输入密码。在任何一种情况下,从密码派生的密钥都将添加到主题的私有凭证集中。配置为仅充当接受者,不通过 AS 交换获取凭据。仅对于接受器,将此值设置为 false。对于启动器,请勿将此值设置为 false。isInitiator = false
配置为启动器,凭证通过 AS 交换获取。对于启动器,将此值设置为 true,或不设置此选项,在这种情况下将使用默认值 (true)。isInitiator = true
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述boolean
abort()
如果 LoginContext 的整体身份验证失败,则调用此方法。boolean
commit()
如果 LoginContext 的整体身份验证成功(相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 成功),则调用此方法。void
initialize
(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) 初始化这个LoginModule
。boolean
login()
验证用户boolean
logout()
注销用户。
-
构造方法详细信息
-
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
验证用户- 指定者:
login
在接口LoginModule
中- 返回:
-
在所有情况下都为真,因为不应忽略此
LoginModule
。 - 抛出:
FailedLoginException
- 如果身份验证失败。LoginException
- 如果此LoginModule
无法执行身份验证。
-
commit
如果 LoginContext 的整体身份验证成功(相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 成功),则调用此方法。如果此 LoginModule 自己的身份验证尝试成功(通过检索
login
方法保存的私有状态进行检查),则此方法将Krb5Principal
与位于LoginModule
中的Subject
相关联。它将 Kerberos 凭据添加到主题的私有凭据集中。如果此 LoginModule 自己的身份验证尝试失败,则此方法会删除最初保存的所有状态。- 指定者:
commit
在接口LoginModule
中- 返回:
- 如果此 LoginModule 自己的登录和提交尝试成功,则为 true,否则为 false。
- 抛出:
LoginException
- 如果提交失败。
-
abort
如果 LoginContext 的整体身份验证失败,则调用此方法。 (相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 没有成功)。如果此 LoginModule 自己的身份验证尝试成功(通过检索
login
和commit
方法保存的私有状态进行检查),则此方法会清除最初保存的任何状态。- 指定者:
abort
在接口LoginModule
中- 返回:
- 如果此 LoginModule 自己的登录和/或提交尝试失败,则为 false,否则为 true。
- 抛出:
LoginException
- 如果中止失败。
-
logout
注销用户。此方法删除由
commit
方法添加的Krb5Principal
。- 指定者:
logout
在接口LoginModule
中- 返回:
-
在所有情况下都为真,因为不应忽略此
LoginModule
。 - 抛出:
LoginException
- 如果注销失败。
-