2017-06-12 196 views
1

我已經使用JNDIRealm在tomcat中設置了spnego庫。 遵循以下指南:https://dzone.com/articles/do-not-publish-configuring-tomcat-single-sign-on-w 我想知道我可以從另一個java類中的LDAP中獲得用戶組,我正在使用它在我的數據庫中創建一個用戶。我想獲得所有用戶的詳細信息,如電子郵件,電話等。以及用戶所屬的所有組。SPNEGO獲取用戶詳細信息

+0

只是要清楚,你沒有管理Java類中連接到LDAP?如果是的話,你可以添加你的代碼片段嗎? – fab

+0

我只是按照鏈接,它確實用戶身份,並給我用戶名。然而,我現在想編寫代碼來獲取更多用戶的細節。要獲取用戶名,我使用request.getRemoteUser()。 – michael

回答

0

請參閱this list以獲取您可以從LDAP中檢索的所有屬性。


例如,假設您需要用戶的名稱,組,職位,電話號碼和電子郵件。 (對於你的問題,我將使用與你的鏈接相同的「虛擬值」)。

的第一步是連接到LDAP中的Java類,對於我寧願使用一個單獨的功能:

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對象。這是,你會把你想(見上面的鏈接瞭解所有的可能)的屬性和一些PARAMATERS(超時爲例):

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(); 
相關問題