- 所有已知的实现类:
JndiLoginModule
,KeyStoreLoginModule
,Krb5LoginModule
,LdapLoginModule
,NTLoginModule
,UnixLoginModule
身份验证技术提供商的服务提供者接口。 LoginModules 在应用程序下插入以提供特定类型的身份验证。
当应用程序写入 LoginContext
API 时,身份验证技术提供商会实现 LoginModule
接口。 Configuration
指定要与特定登录应用程序一起使用的登录模块。因此,可以在应用程序下插入不同的登录模块,而无需对应用程序本身进行任何修改。
LoginContext
负责读取 Configuration
并实例化适当的登录模块。每个 LoginModule
都使用 Subject
、 CallbackHandler
、共享 LoginModule
状态和特定于 LoginModule 的选项进行初始化。
Subject
表示当前正在验证的 Subject
,如果验证成功,则会使用相关凭证进行更新。 LoginModules 使用CallbackHandler
与用户进行通信。例如,CallbackHandler
可用于提示输入用户名和密码。请注意,CallbackHandler
可能是 null
。绝对需要 CallbackHandler
来验证 Subject
的登录模块可能会抛出 LoginException
。 LoginModule 可选择使用共享状态在它们之间共享信息或数据。
LoginModule 特定的选项表示管理员或用户在登录 Configuration
中为此 LoginModule
配置的选项。选项由 LoginModule
本身定义并控制其中的行为。例如,LoginModule
可以定义支持调试/测试功能的选项。选项使用键值语法定义,例如调试=真LoginModule
将选项存储为 Map
,以便可以使用密钥检索值。请注意,LoginModule
选择定义的选项数量没有限制。
调用应用程序将身份验证过程视为单个操作。然而,LoginModule
中的身份验证过程分两个不同的阶段进行。在第一阶段,LoginModule 的 login
方法被 LoginContext 的 login
方法调用。 LoginModule
的 login
方法随后执行实际身份验证(例如提示并验证密码)并将其身份验证状态保存为私有状态信息。完成后,LoginModule 的 login
方法要么返回 true
(如果成功)或 false
(如果应该忽略),要么抛出 LoginException
以指定失败。在失败的情况下,LoginModule
不得重试身份验证或引入延迟。此类任务的责任属于应用程序。如果应用程序尝试重试身份验证,则将再次调用 LoginModule 的 login
方法。
在第二阶段,如果 LoginContext 的整体身份验证成功(相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 成功),则调用 LoginModule
的 commit
方法。 LoginModule
的 commit
方法检查其私人保存的状态,以查看其自身的身份验证是否成功。如果整体 LoginContext
身份验证成功并且 LoginModule 自己的身份验证成功,则 commit
方法将相关的主体(经过身份验证的身份)和凭证(身份验证数据,例如加密密钥)与位于 LoginModule
中的 Subject
相关联。
如果 LoginContext 的整体身份验证失败(相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModule 未成功),则调用每个 LoginModule
的 abort
方法。在这种情况下,LoginModule
会删除/销毁最初保存的任何身份验证状态。
注销 Subject
仅涉及一个阶段。 LoginContext
调用 LoginModule 的 logout
方法。 LoginModule
的 logout
方法然后执行注销过程,例如从 Subject
或记录会话信息中删除主体或凭据。
LoginModule
实现必须有一个不带参数的构造函数。这允许加载 LoginModule
的类对其进行实例化。
- 自从:
- 1.4
- 参见:
-
方法总结
-
方法详情
-
initialize
void initialize(Subject subject, CallbackHandler callbackHandler, Map <String , ?> sharedState, Map <String , ?> options) 初始化这个LoginModule
。在这个
LoginModule
被实例化之后,这个方法被LoginContext
调用。这个方法的目的是用相关信息初始化这个LoginModule
。如果此LoginModule
不理解存储在sharedState
或options
参数中的任何数据,则可以忽略它们。- 参数:
subject
- 要验证的Subject
。callbackHandler
- 一个CallbackHandler
用于与最终用户通信(例如,提示输入用户名和密码)。sharedState
- 与其他配置的登录模块共享的状态。options
- 在登录Configuration
中为此特定的LoginModule
指定的选项。
-
login
验证Subject
的方法(第 1 阶段)。此方法的实现对
Subject
进行身份验证。例如,它可能会提示输入用户名和密码等Subject
信息,然后尝试验证密码。此方法将身份验证尝试的结果保存为LoginModule
中的私有状态。- 返回:
true
如果认证成功,或者false
如果这个LoginModule
应该被忽略。- 抛出:
LoginException
- 如果身份验证失败
-
commit
提交身份验证过程(第 2 阶段)的方法。如果 LoginContext 的整体身份验证成功(相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 成功),则调用此方法。
如果此 LoginModule 自己的身份验证尝试成功(通过检索
login
方法保存的私有状态进行检查),则此方法将相关的主体和凭证与位于LoginModule
中的Subject
相关联。如果此 LoginModule 自己的身份验证尝试失败,则此方法会删除/销毁最初保存的任何状态。- 返回:
true
如果此方法成功,或false
如果应忽略此LoginModule
。- 抛出:
LoginException
- 如果提交失败
-
abort
中止身份验证过程(第 2 阶段)的方法。如果 LoginContext 的整体身份验证失败,则调用此方法。 (相关的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModules 没有成功)。
如果此 LoginModule 自己的身份验证尝试成功(通过检索
login
方法保存的私有状态进行检查),则此方法会清除最初保存的任何状态。- 返回:
true
如果此方法成功,或false
如果应忽略此LoginModule
。- 抛出:
LoginException
- 如果中止失败
-
logout
注销Subject
的方法。此方法的实现可能会删除/销毁 Subject 的 Principals 和 Credentials。
- 实现注意事项:
-
在将变量从
Subject
的 Principals 或 Credentials 集合中移除之前,实现应该检查变量是否为null
,否则NullPointerException
将作为这些集合 禁止空元素 被抛出。如果在登录失败后调用此方法,这一点尤其重要。 - 返回:
true
如果此方法成功,或false
如果应忽略此LoginModule
。- 抛出:
LoginException
- 如果注销失败
-