- java.lang.Object
-
- javax.security.auth.login.LoginContext
-
public class LoginContext extends Object
LoginContext
类描述了用于验证主题的基本方法,并提供了一种独立于基础身份验证技术开发应用程序的方法。 AConfiguration
规定了与特定应用程序一起使用的认证技术,或LoginModule
。 可以在应用程序下插入不同的LoginModules,而不需要对应用程序本身进行任何修改。除了支持可插拔身份验证,此类还支持堆叠身份验证的概念。 应用程序可能配置为使用多个LoginModule。 例如,可以在应用程序下配置Kerberos LoginModule和智能卡LoginModule。
一个典型的调用者用一个名字和一个
CallbackHandler
实例化一个LoginContext。 LoginContext使用名称作为索引到配置中,以确定应使用哪个LoginModule,以及哪些必须成功才能使整体身份验证成功。 将CallbackHandler
传递给基础的LoginModules,以便他们可以与用户进行通信并进行交互(例如,通过图形用户界面提示用户名和密码)。一旦调用者实例化了一个LoginContext,它调用了
login
方法来验证一个Subject
。login
方法调用配置的模块来执行各自的认证(用户名/密码,智能卡引脚验证等)。 请注意,如果身份验证失败,LoginModules将不会尝试进行身份验证重试,也不会引入延迟。 这些任务属于LoginContext调用者。如果
login
方法返回而不会抛出异常,则整体认证成功。 呼叫者可以通过调用getSubject
方法来检索新认证的主题。 与Subject相关的Principals和Credentials可以通过调用主题的各个被检索getPrincipals
,getPublicCredentials
,和getPrivateCredentials
方法。要注销主题,调用者调用
logout
方法。 与login
方法一样,此logout
方法调用已配置模块的logout
方法。不应该使用LoginContext来认证多个主题。 应该使用单独的LoginContext来认证每个不同的主题。
以下文档适用于所有LoginContext构造函数:
-
Subject
- 如果构造函数具有Subject输入参数,则LoginContext将使用调用者指定的Subject对象。
- 如果调用者指定了一个
null
主题和一个null
值,则LoginContext会实例化一个新的主题。 - 如果构造没有一个主题输入参数,则LoginContext实例化一个新的主题。
-
Configuration
- 如果构造函数具有配置输入参数,并且调用者指定非空配置,则LoginContext将使用调用者指定的配置。
如果构造没有配置输入参数,或者调用者指定一个
null
配置对象,构造函数使用以下调用来获取安装配置:config = Configuration.getConfiguration();
对于这两种情况,给构造函数的名称参数都传递给Configuration.getAppConfigurationEntry
方法。 如果配置没有指定名称的条目,则LoginContext
调用getAppConfigurationEntry
名称为“ other ”(默认条目名称)。 如果没有“ 其他 ”条目,则抛出一个LoginException
。 - 当LoginContext使用已安装的配置时,调用者需要createLoginContext。 名称和可能的createLoginContext.other AuthPermissions。 此外,LoginContext将从
AccessController.doPrivileged
调用中调用配置的模块,以便执行安全敏感任务(如连接到远程主机和更新主题)的模块将需要相应的权限,但是LoginContext的调用者将不需要那些权限。 - 当LoginContext使用调用者指定的配置时,调用者不需要任何createLoginContext AuthPermission。 LoginContext为呼叫者保存
AccessControlContext
,并在由该上下文限制的AccessController.doPrivileged
调用中调用配置的模块。 这意味着调用者上下文(在创建LoginContext时存储)必须具有足够的权限来执行模块可能执行的任何对安全敏感的任务。
- 如果构造函数具有配置输入参数,并且调用者指定非空配置,则LoginContext将使用调用者指定的配置。
-
CallbackHandler
- 如果构造函数有一个CallbackHandler输入参数,那么LoginContext使用调用者指定的CallbackHandler对象。
- 如果构造没有给CallbackHandler输入参数,或者调用者指定一个
null
CallbackHandler对象(并且null
值是允许的),则LoginContext查询auth.login.defaultCallbackHandler
安全属性的默认处理程序实现的完全限定类名。 如果未设置安全属性,则底层模块将不具有用于与用户通信的CallbackHandler。 因此,呼叫者假设所配置的模块具有用于认证用户的替代手段。 - 当LoginContext使用已安装的配置(而不是调用者指定的配置,请参见上文)时,这个LoginContext必须在一个新的CallbackHandler实现中包装任何调用者指定的或默认的CallbackHandler实现,该实现的
handle
方法实现会调用指定的CallbackHandler的handle
方法java.security.AccessController.doPrivileged
呼叫受到呼叫者当前的AccessControlContext
。
- 从以下版本开始:
- 1.4
- 另请参见:
-
Security
,AuthPermission
,Subject
,CallbackHandler
,Configuration
,LoginModule
,security properties
-
-
-
构造方法摘要
构造方法 Constructor 描述 LoginContext(String name)
使用名称实例化一个新的LoginContext
对象。LoginContext(String name, CallbackHandler callbackHandler)
实例化一个新的LoginContext
的名称和一个对象CallbackHandler
对象。LoginContext(String name, Subject subject)
实例化一个新的LoginContext
的名称和一个对象Subject
对象。LoginContext(String name, Subject subject, CallbackHandler callbackHandler)
实例化一个新LoginContext
对象有一个名字,一个Subject
要进行身份验证,以及CallbackHandler
对象。LoginContext(String name, Subject subject, CallbackHandler callbackHandler, Configuration config)
实例化一个新LoginContext
对象有一个名字,一个Subject
要进行身份验证,一个CallbackHandler
对象,登录Configuration
。
-
-
-
构造方法详细信息
-
LoginContext
public LoginContext(String name) throws LoginException
使用名称实例化一个新的LoginContext
对象。- 参数
-
name
- 用作索引的名称为Configuration
。 - 异常
-
LoginException
- 如果呼叫者指定的name
没有出现在Configuration
并且没有Configuration
条目为“other
”,或者如果设置了auth.login.defaultCallbackHandler
安全属性,但实现类无法加载。 -
SecurityException
- (“ createLoginContext 名称 ‘),如果安全管理器被设置并且呼叫者没有AuthPermission,或者如果配置条目name
不存在,并且调用者不另外具有AuthPermission(’createLoginContext.other”)
-
LoginContext
public LoginContext(String name, Subject subject) throws LoginException
实例化一个新的LoginContext
的名称和一个对象Subject
对象。- 参数
-
name
- 该名称用作Configuration
的索引。 -
subject
- 要验证的Subject
。 - 异常
-
LoginException
- 如果呼叫者指定的name
未出现在Configuration
并且没有“ 其他 ”的Configuration
条目,如果呼叫者指定的subject
为null
,或者如果设置了 auth.login.defaultCallbackHandler安全属性,但是实现课程无法加载。 -
SecurityException
- (“ createLoginContext 名称 ‘),如果安全管理器被设置并且呼叫者没有AuthPermission,或者如果 名称的配置条目不存在,并且调用者不另外具有AuthPermission(’createLoginContext.other”)
-
LoginContext
public LoginContext(String name, CallbackHandler callbackHandler) throws LoginException
实例化一个新的LoginContext
的名称和一个对象CallbackHandler
对象。- 参数
-
name
- 该名称用作Configuration
的索引。 -
callbackHandler
- LoginModules用于与用户通信的CallbackHandler
对象。 - 异常
-
LoginException
- 如果来电者指定的name
未出现在Configuration
并且没有Configuration
条目“other
”,或者如果来电者指定的callbackHandler
为null
。 -
SecurityException
- (“ createLoginContext 名称 ‘),如果安全管理器被设置并且呼叫者没有AuthPermission,或者如果 名称的配置条目不存在,并且调用者不另外具有AuthPermission(’createLoginContext.other”)
-
LoginContext
public LoginContext(String name, Subject subject, CallbackHandler callbackHandler) throws LoginException
实例化一个新LoginContext
对象有一个名字,一个Subject
要进行身份验证,以及CallbackHandler
对象。- 参数
-
name
- 用作索引的名称为Configuration
。 -
subject
- 要验证的Subject
。 -
callbackHandler
- LoginModules用于与用户通信的CallbackHandler
对象。 - 异常
-
LoginException
- 如果呼叫者指定的name
未出现在Configuration
并且没有“ 其他 ”的Configuration
条目,或者如果主叫方指定的subject
为null
,或者主叫方指定的callbackHandler
为null
。 -
SecurityException
- (“ createLoginContext 名称 ‘),如果安全管理器被设置并且呼叫者没有AuthPermission,或者如果 名称的配置条目不存在,并且调用者不另外具有AuthPermission(’createLoginContext.other”)
-
LoginContext
public LoginContext(String name, Subject subject, CallbackHandler callbackHandler, Configuration config) throws LoginException
实例化一个新LoginContext
对象有一个名字,一个Subject
要进行身份验证,一个CallbackHandler
对象,登录Configuration
。- 参数
-
name
- 用作索引到调用者指定的名称的名称Configuration
。 -
subject
- 要验证的Subject
,或者是null
。 -
callbackHandler
- LoginModules用于与用户通信的CallbackHandler
对象,或null
。 -
config
-Configuration
列出要调用以执行身份验证的登录模块,或null
。 - 异常
-
LoginException
- 如果来电者指定的name
没有出现在Configuration
并且没有“ 其他 ”的Configuration
条目。 -
SecurityException
-如果安全管理器被设置, 配置是null
,并且或者调用者没有AuthPermission(“。createLoginContext 名 ‘),或者如果为 名称的配置条目不存在,并且调用者不另外具有AuthPermission(’createLoginContext。其他”) - 从以下版本开始:
- 1.5
-
-
方法详细信息
-
login
public void login() throws LoginException
执行认证。此方法为
login
LoginContext
构造函数指定的名称配置的每个LoginModule调用login
方法,由登录Configuration
确定。 然后,每个LoginModule
执行其相应类型的认证(用户名/密码,智能卡引脚验证等)。此方法通过调用每一个被配置LoginModule的完成了2阶段认证过程
commit
方法,如果整个身份验证成功(相关的REQUIRED,REQUISITE,足够了,和可选的LoginModules成功),或者通过调用每个配置的LoginModule的abort
方法如果整体验证失败。 如果认证成功,每个成功的LoginModule的commit
方法将相关的主体和凭据与Subject
相关联。 如果身份验证失败,则每个LoginModule的abort
方法将删除/销毁任何先前存储的状态。如果验证过程的
commit
阶段失败,则整体认证失败,并且该方法为每个配置的LoginModule
调用abort
方法。如果
abort
阶段由于任何原因而失败,则该方法传播在login
阶段或commit
阶段抛出的原始异常。 在任一种情况下,总体身份验证失败。在多个LoginModules失败的情况下,此方法会传播由失败的第一个
LoginModule
引发的异常。请注意,如果此方法进入
abort
阶段(login
或commit
阶段失败),则此方法将调用为应用程序配置的所有LoginModule,而不管其各自的Configuration
标志参数。 基本上这意味着在abort
阶段,Requisite
和Sufficient
语义被忽略。 这样可以保证适当的清理和状态恢复。- 异常
-
LoginException
- 如果身份验证失败。
-
logout
public void logout() throws LoginException
注销Subject
。此方法调用
logout
每个方法LoginModule
配置用于此LoginContext
。 每个LoginModule
执行其各自的注销过程,其中可能包括从Subject
和状态清除中删除/销毁Principal
和Credential
信息。请注意,此方法调用为应用程序配置的所有LoginModule,而不管其各自的
Configuration
标志参数。 本质上这意味着Requisite
和Sufficient
语义将被忽略。 这样可以保证适当的清理和状态恢复。- 异常
-
LoginException
- 如果注销失败。
-
getSubject
public Subject getSubject()
返回认证的主题。- 结果
- 认证主题。 如果调用者指定了一个Subject到此LoginContext的构造函数,则此方法返回调用者指定的Subject。 如果未指定主题并且验证成功,则此方法返回被实例化的主题,并用于此LoginContext的身份验证。 如果未指定主题,并且认证失败或未尝试,则此方法返回null。
-
-