Class JndiLoginModule

java.lang.Object
com.sun.security.auth.module.JndiLoginModule
所有已实现的接口:
LoginModule

public class JndiLoginModule extends Object implements LoginModule
该模块提示用户输入用户名和密码,然后根据在JNDI下配置的目录服务中存储的密码验证密码。

这个LoginModule与任何符合JNDI服务提供者进行交互。要指示这个LoginModule使用特定的JNDI服务提供者,必须在此LoginModule的登录Configuration中指定两个选项。

      user.provider.url=name_service_url
      group.provider.url=name_service_url
 
name_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=USou=Groups,o=Sun,c=US分别用于用户和组信息)。

用户信息必须按照RFC 2307规定的格式存储在目录服务中。具体来说,这个LoginModule将使用用户的uid属性在目录服务中搜索用户条目,其中uid=username。如果搜索成功,这个LoginModule将从检索到的条目中使用userPassword属性获取用户的加密密码。这个LoginModule假定密码存储为字节数组,转换为String后的格式如下:

      "{crypt}encrypted_password"
 
LDAP目录服务器必须配置为允许读取userPassword属性。如果用户输入了有效的用户名和密码,这个LoginModule将将UnixPrincipalUnixNumericUserPrincipal和相关的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 Details

    • USER_PROVIDER

      public final String USER_PROVIDER
      模块可以访问相关用户信息的目录服务/路径。
      参见:
    • GROUP_PROVIDER

      public final String 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

      public boolean login() throws LoginException
      提示输入用户名和密码。验证密码与相关名称服务的密码。
      指定者:
      login 在接口 LoginModule
      返回:
      始终为true,因为不应忽略这个LoginModule
      抛出:
      FailedLoginException - 如果身份验证失败。
      LoginException - 如果这个LoginModule无法执行身份验证。
    • commit

      public boolean commit() throws LoginException
      提交身份验证过程的抽象方法(第2阶段)。

      如果LoginContext的整体身份验证成功(相关的REQUIRED、REQUISITE、SUFFICIENT和OPTIONAL LoginModules成功),则调用此方法。

      如果这个LoginModule自己的身份验证尝试成功(通过login方法保存的私有状态进行检查),则此方法将UnixPrincipalLoginModule中的Subject关联。如果这个LoginModule自己的身份验证尝试失败,则此方法将删除最初保存的任何状态。

      指定者:
      commit 在接口 LoginModule
      返回:
      如果这个LoginModule自己的登录和提交尝试成功,则为true,否则为false。
      抛出:
      LoginException - 如果提交失败
    • abort

      public boolean abort() throws LoginException
      如果LoginContext的整体身份验证失败,则调用此方法(相关的REQUIRED、REQUISITE、SUFFICIENT和OPTIONAL LoginModules未成功)。

      如果这个LoginModule自己的身份验证尝试成功(通过logincommit方法保存的私有状态进行检查),则此方法将清理最初保存的任何状态。

      指定者:
      abort 在接口 LoginModule
      返回:
      如果这个LoginModule自己的登录和/或提交尝试失败,则为false,否则为true。
      抛出:
      LoginException - 如果中止失败。
    • logout

      public boolean logout() throws LoginException
      注销用户。

      此方法将删除由commit方法添加的Principal。

      指定者:
      logout 在接口 LoginModule
      返回值:
      在所有情况下都返回true,因为这个LoginModule不应该被忽略。
      抛出:
      LoginException - 如果注销失败。