java.lang.Object
com.sun.security.auth.module.JndiLoginModule
- 所有已实现的接口:
-
LoginModule
该模块提示用户输入用户名和密码,然后根据在JNDI下配置的目录服务中存储的密码验证密码。
这个LoginModule
与任何符合JNDI服务提供者进行交互。要指示这个LoginModule
使用特定的JNDI服务提供者,必须在此LoginModule
的登录Configuration
中指定两个选项。
user.provider.url=name_service_url group.provider.url=name_service_urlname_service_url指定了目录服务和路径,该
LoginModule
可以访问相关用户和组信息。因为这个LoginModule
只执行一级搜索以找到相关用户信息,所以URL
必须指向存储在目录服务中用户和组信息上一级的目录。例如,要指示这个LoginModule
联系NIS服务器,必须指定以下URL:
user.provider.url="nis://NISServerHostName/NISDomain/user" group.provider.url="nis://NISServerHostName/NISDomain/system/group"NISServerHostName指定了NIS服务器的服务器主机名(例如,nis.sun.com),NISDomain指定了该NIS服务器的域(例如,jaas.sun.com)。要联系LDAP服务器,必须指定以下URL:
user.provider.url="ldap://LDAPServerHostName/LDAPName" group.provider.url="ldap://LDAPServerHostName/LDAPName"LDAPServerHostName指定了LDAP服务器的服务器主机名,可能包括端口号(例如,ldap.sun.com:389),LDAPName指定了LDAP目录中的条目名称(例如,ou=People,o=Sun,c=US和ou=Groups,o=Sun,c=US分别用于用户和组信息)。
用户信息必须按照RFC 2307规定的格式存储在目录服务中。具体来说,这个LoginModule
将使用用户的uid属性在目录服务中搜索用户条目,其中uid=username。如果搜索成功,这个LoginModule
将从检索到的条目中使用userPassword属性获取用户的加密密码。这个LoginModule
假定密码存储为字节数组,转换为String
后的格式如下:
"{crypt}encrypted_password"LDAP目录服务器必须配置为允许读取userPassword属性。如果用户输入了有效的用户名和密码,这个
LoginModule
将将UnixPrincipal
、UnixNumericUserPrincipal
和相关的UnixNumericGroupPrincipals与Subject
关联。
这个LoginModule还识别以下Configuration
选项:
debug 如果为true,则将调试消息输出到System.out。
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
将清除
存储在模块的共享状态中的用户名和密码
在身份验证(登录和提交)的两个阶段完成后。
-
Field Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionboolean
abort()
如果LoginContext的整体身份验证失败,则调用此方法。boolean
commit()
提交身份验证过程的抽象方法(第2阶段)。void
initialize
(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) 初始化这个LoginModule
。boolean
login()
提示输入用户名和密码。boolean
logout()
注销用户。
-
Field Details
-
USER_PROVIDER
模块可以访问相关用户信息的目录服务/路径。- 参见:
-
GROUP_PROVIDER
模块可以访问相关组信息的目录服务/路径。- 参见:
-
-
Constructor Details
-
JndiLoginModule
public JndiLoginModule()创建一个JndiLoginModule
。
-
-
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
提交身份验证过程的抽象方法(第2阶段)。如果LoginContext的整体身份验证成功(相关的REQUIRED、REQUISITE、SUFFICIENT和OPTIONAL LoginModules成功),则调用此方法。
如果这个LoginModule自己的身份验证尝试成功(通过
login
方法保存的私有状态进行检查),则此方法将UnixPrincipal
与LoginModule
中的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
方法添加的Principal。- 指定者:
-
logout
在接口LoginModule
中 - 返回值:
-
在所有情况下都返回true,因为这个
LoginModule
不应该被忽略。 - 抛出:
-
LoginException
- 如果注销失败。
-