2013-03-14 164 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