2013-03-14 162 views
2

我正在使用IBM Worklight開發移動應用程序,並且我在身份驗證過程中遇到了一些問題。我正在使用自定義身份驗證程序和自定義登錄模塊來針對Tivoli目錄服務器驗證用戶憑據。無法在IBM Worklight中使用LDAP身份驗證進行身份驗證

這是我正在使用的代碼,它在Worklight Studio中像java應用程序(具有主方法的類)運行時運行,但是當我像Worklight應用程序一樣運行它時(在我的自定義的登錄函數中登錄模塊),它返回一個命名異常並打印jndi.20

public boolean login(Map<String, Object> authenticationData) { 
    logger.info("SmaciLoginModule :: login"); 

    try{ 
     USERNAME = (String) authenticationData.get("username"); 
     PASSWORD = (String) authenticationData.get("password"); 
     String solicuser="uid="+USERNAME+",cn=users,dc=smaci,dc=ibm"; 
     Hashtable<String, String> env = new Hashtable<String, String>(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://127.0.0.1:1389/"); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, solicuser); 
     env.put(Context.SECURITY_CREDENTIALS, PASSWORD); 
     DirContext ctx = new InitialDirContext(env); 
     boolean result = ctx != null; 

       if(ctx != null) 
        ctx.close(); 

      return result; 

     }catch (Exception e) { 
      throw new RuntimeException("Invalid credentials"+e.getMessage()); 
     } 
} 

我希望你能幫助我與我的問題。我沒有使用LDAP的經驗,我很欣賞任何建議。 謝謝!

回答

1

您是否試圖從用戶那裏獲取密碼? String pass=(String) entry.get("password").get().toString();

如果是這樣,那是不太可能的。密碼幾乎不能通過LDAP進行檢索。 (例外情況稍微複雜,所以認爲不可能)。

你想要做的是嘗試綁定solicuser內置的DN和PASSWORD值。然後在成功(密碼不是空的,因爲它總是成功,但作爲匿名綁定,所以你必須注意它),你知道你的身份驗證。否則你失敗了。您可能希望檢查可能的錯誤消息。各種LDAP服務器給出不同的錯誤。有些會報告錯誤的密碼或錯誤的DN(即沒有這樣的用戶)。其他人不多。

+0

謝謝你的回答!當我在Worklight Studio中像Java應用程序(具有main方法的類)運行代碼時,我更改了代碼,但是當它像Worklight應用程序(在我的自定義登錄模塊的登錄函數中)運行時,它會打印相同的錯誤(jndi.20)。 – user2171359 2013-03-15 20:09:16