2013-01-24 63 views
0

通用名,可以說使用「John Smith」來組成DN,但可以使用UID組成一個完整的DN。DN - Java JDNI LDAP - 通用名與用戶標識

我目前正在做這個,它的工作原理。

Hashtable env = new Hashtable(11); 
env.put(Context.INITIAL_CONTEXT_FACTORY, 
env.put(Context.PROVIDER_URL, "ldap://myDomain.com"); 
env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
env.put(Context.SECURITY_PRINCIPAL, "CN=John Smith,OU=IT,OU=MyCompany,OU=Users,DC=myDomain,DC=com"); 
env.put(Context.SECURITY_CREDENTIALS, "myPassWrd"); 

現在我想用UID,例如J.smith,進行身份驗證,而不是他的全名。有任何想法嗎?

回答

1

我用:

env.put(Context.SECURITY_PRINCIPAL, username); 
env.put(Context.SECURITY_CREDENTIALS, password); 

爲我工作。

+1

正在將@domain添加到用戶名字符串中。謝謝 –

+0

@MichelBehlok那麼用戶名字符串必須與目錄中的任何內容匹配。 – EJP

+0

非常感謝。 @MichelBehlok您添加域名的解決方案非常完美。 – ThePrince

2

在我們的LDAP autenthication程序,我們創建了一個應用程序使用,以自身的LDAP認證,一旦申請stablishes使用JNDI用戶(例如:uid=jndi,ou=branch,dc=com,dc=your,dc=organization)的專有名稱的連接jndi用戶帳戶,然後(提供檢查樹,它使用下面的代碼的用戶節點)的分支,如果用戶uid是LDAP樹:

public String findUserDnByBranchAndUid(String branchName, String uid) throws NamingException { 
    SearchControls searchControls = new SearchControls(); 
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    searchControls.setCountLimit(1); 

    NamingEnumeration<SearchResult> answer; 
    answer = dirContext.search(branchName, String.format("(uid=%s)", uid), searchControls); 

    if (answer.hasMoreElements()) { 
     SearchResult searchResult = answer.nextElement(); 
     return searchResult.getNameInNamespace(); 
    } else { 
     return null; 
    } 
} 

調用它像這樣:

String userDn = findUserDnByBranchAndUid("ou=users,dc=com,dc=your,dc=organization", "jsmith"); 

如果userDn不爲空,則用戶存在於樹中,然後我們繼續使用該DN(和用戶密碼)而不是jndi用戶DN建立新的連接。

如果一切順利,那麼用戶jsmith使用其憑據以他/她的身份登錄,而不提供任何不方便用戶的DN。