检查在Java应用程序中使用Active Directory登录的用户

时间:2014-07-25 19:25:25

标签: java active-directory ldap

因此,我已经环顾四周找到了我正在寻找的答案,特别是在这个网站上,没有任何运气或方法可以得到我想要的应用程序。

它是一个java应用程序,我尝试与Windows Server 2012 R2中的Active Directory进行交互,因此如果用户已登录到他们的计算机,则用户不必登录此Java应用程序使用Active Directory。

我听说如果用户使用Active Directory登录,机器上就会有某种令牌,我希望我能够检查该令牌,获取用户名登录用户,并使用该用户名将其登录到Java应用程序(忽略密码)。我想这样做,而不必对AD服务器进行身份验证。

我不确定这是针对此Java应用程序管理Active Directory的最有效方式,但鉴于我的情况,这是我需要的全部内容。

欢迎链接,如果之前已经提出过这个问题,我很抱歉。

编辑:这假设我可用的唯一信息是Active Directory用户的用户名,该用户名将与java应用程序中的用户名相匹配。我也有服务器凭据,但我试图避免以任何形式存储服务器的密码。

1 个答案:

答案 0 :(得分:2)

想出来。使用System.getenv(" USERDNSDOMAIN")为我们提供了user @ domain,如果用户没有使用Active Directory登录,则该域为null,这在这种情况下就足够了。然后我们使用JAAS和服务器配置文件来获取我们的LoginContext,它从登录用户获取Subject。

希望这有助于某人!

例如,这里是代码:

//this returns the logged in user if they're authenticated with the ldap server (Active Directory)
public javax.security.auth.Subject getSubject()
{
    String ldapServer = System.getenv("USERDNSDOMAIN");

    if (ldapServer == null)
    {
      Logger.error("No \"USERDNSDOMAIN\" environment variable found");
      return null;
    }

    System.setProperty("java.security.auth.login.config", "jaas.conf");
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "true");
    try
    {
      LoginContext loginCtx = new LoginContext("Server", new TextCallbackHandler());
      loginCtx.login();
      return loginCtx.getSubject();
    }
}

和jaas.conf文件的内容:

Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
useTicketCache=true;
};