【问题标题】:SPNEGO get user detailsSPNEGO 获取用户详细信息
【发布时间】:2017-06-12 15:37:47
【问题描述】:

我已经使用 JNDIRealm 在 tomcat 中设置了 spnego 库。 遵循以下指南:https://dzone.com/articles/do-not-publish-configuring-tomcat-single-sign-on-w 我想知道我可以在另一个 java 类中从 LDAP 获取用户组,我正在使用该类在我的数据库中创建用户。我想获取所有用户详细信息,例如电子邮件、电话等。以及该用户所属的所有组。

【问题讨论】:

  • 为了清楚起见,您确实设法在 java 类中连接到 LDAP 吗?如果是,您可以添加您的代码 sn-p 吗?
  • 我只是点击了链接,它确实验证了用户并给了我用户名。然而,我现在想编写代码来获取用户的更多详细信息。要获取用户名,我使用 request.getRemoteUser()。

标签: java jakarta-ee kerberos spnego


【解决方案1】:

请参阅this list 以获取您可以从 LDAP 检索的所有属性。


例如,假设您想要用户的姓名、组、职位、电话号码和电子邮件。 (为了与您的问题保持一致,我将使用与您的链接相同的“虚拟值”)。

第一步是在您的 Java 类中连接到 LDAP,为此我宁愿使用单独的函数:

public static Hashtable<String, String> getContextEnv() {
  Hashtable<String, String> contextEnv = new Hashtable<String, String>();
  contextEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  contextEnv.put(Context.PROVIDER_URL, "ldap://dc.mydomain.com:3268");
  contextEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
  contextEnv.put(Context.SECURITY_PRINCIPAL, "CN=TECHNICAL_USER,DC=mydomain,DC=com");
  contextEnv.put(Context.SECURITY_CREDENTIALS, "TECHNICAL_USER_PASSWORD");
  contextEnv.put("java.naming.referral", "follow");
  contextEnv.put("java.naming.ldap.derefAliases", "never");
  contextEnv.put("com.sun.jndi.ldap.connect.pool", "true");
  contextEnv.put("com.sun.jndi.ldap.connect.timeout", "60000");

  return contextEnv;
}

TECHNICAL_USER 是您使用 ktpass 命令创建密钥表的用户。


下一步是调用该函数,并创建一个 SearchControls 对象。您可以在此处放置您想要获取的属性(有关所有可能性,请参见上面的链接)和一些参数(例如超时):

Hashtable<String, String> contextEnv = getContextEnv();

DirContext ctx = new InitialDirContext(contextEnv);    

// UserID - Last Name - First Name - Group - Job Title - Phone Number - Email address
String[] attrIDs = { "sAMAccountName", "sn", "givenName", "memberOf", "title", "telephoneNumber", "mail"};
SearchControls searchControls = new SearchControls();
searchControls.setReturningAttributes(attrIDs);
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchControls.setTimeLimit(6000);

最后一步,您将获得当前用户的信息,其中 currentUser 是您的公司用来识别员工的用户 ID:

NamingEnumeration<SearchResult> searchResults = ctx.search("DC=mydomain,DC=com", "(sAMAccountName=" + currentUser + ")", searchControls);

if (searchResults.hasMore()) {
  SearchResult currentSearchResult = searchResults.next();
  Attributes searchResultAttributes = currentSearchResult.getAttributes();

  String userID = searchResultAttributes.get("sAMAccountName");
  String lastName = searchResultAttributes.get("sn");
  String firstName = searchResultAttributes.get("givenName");
  String group = searchResultAttributes.get("memberOf");
  String jobTitle = searchResultAttributes.get("title");
  String phoneNumber = searchResultAttributes.get("telephoneNumber");
  String email = searchResultAttributes.get("mail");

  searchResults.close();
}

ctx.close();

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多