2

IBM Worklight を使用してモバイル・アプリケーションを開発していますが、認証に問題があります。Tivoli ディレクトリー・サーバーに対してユーザー資格情報を検証するために、カスタム・オーセンティケーターとカスタム・ログイン・モジュールを使用しています。

これは私が使用しているコードです。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 を使用した経験がありません。何か提案をいただければ幸いです。ありがとうございました!

4

1 に答える 1

2

この行で、ユーザーからパスワードを取得しようとしていますか? String pass=(String) entry.get("password").get().toString();

もしそうなら、それはうまくいかないでしょう。LDAP 経由でパスワードを取得することはほとんどありません。(例外は少し複雑なので、不可能と考えてください)。

solicuser代わりに、構築された DN と PASSWORD 値をバインドしてみます。次に、成功すると (パスワードは空ではありません。これは常に成功しますが、匿名バインドであるため、監視する必要があります)、認証済みであることがわかります。そうでなければ失敗します。考えられるエラー メッセージを調べることをお勧めします。さまざまな LDAP サーバーでさまざまなエラーが発生します。不適切なパスワードや不適切な DN (つまり、No such user) を報告する人もいます。他はそれほどでもない。

于 2013-03-14T22:51:14.190 に答える