SPNEGO 获取用户详细信息
SPNEGO get user details
我已经使用 JNDIRealm 在 tomcat 中设置了 spnego 库。
遵循以下指南:https://dzone.com/articles/do-not-publish-configuring-tomcat-single-sign-on-w
我想知道我可以从另一个 java class 中的 LDAP 获取用户组,我正在使用它在我的数据库中创建一个用户。我想获取所有用户详细信息,如电子邮件、phone 等。以及用户所属的所有组。
请参阅 this list 以获取您可以从 LDAP 检索的所有属性。
例如,假设您需要用户的姓名、组、职务、Phone 号码和电子邮件。 (为了与您的问题保持一致,我将使用与您的 link 相同的 "dummy value")。
第一步是在您的 Java class 中连接到 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 对象。在这里您可以放置您想要获得的属性(请参阅上面的 link 以了解所有可能性)和一些参数(例如超时):
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();
我已经使用 JNDIRealm 在 tomcat 中设置了 spnego 库。 遵循以下指南:https://dzone.com/articles/do-not-publish-configuring-tomcat-single-sign-on-w 我想知道我可以从另一个 java class 中的 LDAP 获取用户组,我正在使用它在我的数据库中创建一个用户。我想获取所有用户详细信息,如电子邮件、phone 等。以及用户所属的所有组。
请参阅 this list 以获取您可以从 LDAP 检索的所有属性。
例如,假设您需要用户的姓名、组、职务、Phone 号码和电子邮件。 (为了与您的问题保持一致,我将使用与您的 link 相同的 "dummy value")。
第一步是在您的 Java class 中连接到 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 对象。在这里您可以放置您想要获得的属性(请参阅上面的 link 以了解所有可能性)和一些参数(例如超时):
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();