- 所有已实现的接口:
-
LoginModule
LoginModule
使用Kerberos协议对用户进行身份验证。
Krb5LoginModule
的配置条目有几个选项,用于控制身份验证过程和对Subject
的私有凭据集的添加。不管这些选项如何设置,只有在调用commit
时Subject
的主体集和私有凭据集才会被更新。在调用commit
时,KerberosPrincipal
会被添加到Subject
的主体集中(除非principal
被指定为“*”)。如果isInitiator
为true,则KerberosTicket
会被添加到Subject
的私有凭据中。
如果KerberosLoginModule
的配置条目中的选项storeKey
设置为true,那么KerberosKey
或KeyTab
也会被添加到主体的私有凭据中。对于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”的值将被忽略。
当提供多种检索票据或密钥的机制时,首选顺序为:
- 票据缓存
- keytab
- 共享状态
- 用户提示
请注意,如果任何步骤失败,将回退到下一步。只有一个例外,如果共享状态步骤失败且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,但无法通过提示用户、从keytab获取密钥或从共享状态获取密钥。将会发生配置错误。这是一个非法的组合,因为useKeyTab没有设置为true,但设置了keyTab。将会发生配置错误。keyTab = <filename> doNotPrompt = true
提示用户输入主体名称和密码。使用身份验证交换从KDC获取TGT并将debug = true
Subject
填充为主体和TGT。输出调试消息。检查默认缓存中的TGT并将useTicketCache = true doNotPrompt = true
Subject
填充为主体和TGT。如果TGT不可用,则不提示用户,而是认证失败。从默认缓存中获取主体的TGT并填充主体的主体和私有凭证集。如果票证缓存不可用或不包含主体的TGT,则认证将失败。principal = <name> useTicketCache = true doNotPrompt = true
在缓存中搜索主体的TGT。如果TGT不可用,则使用keytab中的密钥执行与KDC的身份验证交换并获取TGT。主体将填充为主体和TGT。如果密钥不可用或无效,则认证将失败。useTicketCache = true ticketCache = <file name> useKeyTab = true keyTab = <keytab filename> principal = <principal name> doNotPrompt = true
将从指定的缓存中获取TGT。使用的Kerberos主体名称将是票证缓存中的主体名称。如果TGT在票证缓存中不可用,则用户将提示输入主体名称和密码。将使用与KDC的身份验证交换获取TGT。主体将填充为TGT。useTicketCache = true ticketCache = <filename>
将从keytab中检索主体的密钥。如果keytab中没有密钥,则用户将提示输入主体的密码。主体将填充为主体的密钥,无论是从keytab中获取还是从输入的密码派生而来。useKeyTab = true keyTab=<keytab filename> principal = <principal name> storeKey = true
用户将提示输入服务主体名称。如果keytab中存在主体的长期密钥,则将其添加到主体的私有凭证中。将尝试使用keytab中的主体名称和密钥进行身份验证交换。如果成功,则将TGT添加到主体的私有凭证集中。否则,认证将失败。useKeyTab = true keyTab = <keytabname> storeKey = true doNotPrompt = false
接收器将是一个未绑定的接收器,并且可以作为任何主体,只要该主体在keytab中有密钥。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并添加到主体的私有凭证中。此秘密密钥将首先从keytab中检索。如果密钥不可用,则用户将提示输入密码。在任何情况下,从密码派生的密钥将添加到主体的私有凭证集中。配置为仅充当接收器,凭据不通过AS交换获取。对于接收器,将此值设置为false。对于发起者,不要将此值设置为false。isInitiator = false
配置为充当发起者,凭据通过AS交换获取。对于发起者,将此值设置为true,或者不设置此选项,此时将使用默认值(true)。isInitiator = true
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionboolean
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()
注销用户。
-
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
对用户进行身份验证。- 指定者:
-
login
在接口LoginModule
- 返回:
-
在所有情况下返回true,因为不应忽略这个
LoginModule
。 - 抛出:
-
FailedLoginException
- 如果身份验证失败。 -
LoginException
- 如果这个LoginModule
无法执行身份验证。
-
commit
如果LoginContext的整体认证成功(相关的REQUIRED、REQUISITE、SUFFICIENT和OPTIONAL LoginModules都成功)。如果这个LoginModule自己的身份验证尝试成功(通过检索
login
方法保存的私有状态来检查),那么这个方法将Krb5Principal
与LoginModule
中的Subject
关联起来。它将Kerberos凭证添加到Subject的私有凭证集中。如果这个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
- 返回:
-
在所有情况下返回true,因为不应忽略这个
LoginModule
。 - 抛出:
-
LoginException
- 如果注销失败。
-