Как пройти аутентификацию на нативной ОС в Java и без использования JNI? - PullRequest
3 голосов
/ 20 февраля 2009

Мое приложение Java RCP запрашивает у пользователя имя и пароль при запуске. Как я могу использовать эти учетные данные для аутентификации на собственной ОС без использования JNI для портирования некоторых библиотек C? Спасибо!

PS. Если это возможно, реализация на чистом Java без использования сторонних библиотек будет очень предпочтительной.

Ответы [ 3 ]

8 голосов
/ 20 февраля 2009

AFAIK, это просто невозможно без какого-либо вовлечения собственных расширений Java - для этого не существует Java API.

Вы можете взглянуть на проект JNA . Он использует нативный код, но вам не нужно его писать - это сделано для вас.


РЕДАКТИРОВАТЬ: Если все, что вы хотите сделать, это подтвердить имя пользователя / пароль, то я считаю, что направление JNDI / LDAP может работать для вас - я делал это раньше на AS / 400 из Ява, хотя я не был полностью доволен конечным результатом.

Если вы хотите, чтобы O / S распознал ваш процесс JVM как удостоверенный как определенный пользователь, вам потребуется некоторая форма доступа к непереносимым нативным API.

Кстати, о каких операциях мы говорим?


РЕДАКТИРОВАТЬ 2: Я собираюсь опубликовать фрагменты из того, как я использовал LDAP для проверки имени пользователя / пароля, на случай, если это то, что вы ищете; они взяты прямо из моего кода и не предназначены для прямой компиляции.

Это один из первых Java-кодов, который я когда-либо написал, пожалуйста, будьте милостивы:

import java.security.*;
import java.util.*;

import javax.naming.*;
import javax.naming.directory.*;
import javax.naming.ldap.*;

...

private Hashtable                       masterEnv;          // master environment settings
private String                          authMethod;         // default authentication method

...

public void init() {
    // NOTE: Important to use a non-pooled context and a clone of the environment so that this authenticated
    //       connection is not returned to the pool and used for other operations
    masterEnv=new Hashtable();
    masterEnv.put(Context.INITIAL_CONTEXT_FACTORY,ldapFactory);
    masterEnv.put(Context.PROVIDER_URL,providerUrl);
    masterEnv.put(Context.SECURITY_PROTOCOL,secProtocol);
    masterEnv.put(Context.REFERRAL,"follow");
    masterEnv.put("com.sun.jndi.ldap.connect.pool","false");

    authMethod=System.getProperty("authenticationMethod","simple");
    }

...

private void verifyUserPassword(String ui, String pw, String am) throws NameNotFoundException, AuthenticationException, AuthenticationNotSupportedException, NamingException, NamingException {
    // ui=user ID
    // pw=password
    // am=authentication method

    DirContext      lc=null;                                // ldap context object
    Hashtable       le;                                     // ldap environment object

    if(am.length()==0) { am=authMethod; }

    le=(Hashtable)masterEnv.clone();
    le.put(Context.SECURITY_AUTHENTICATION,am);
    le.put(Context.SECURITY_PRINCIPAL     ,ui);
    le.put(Context.SECURITY_CREDENTIALS   ,pw);
    lc=new InitialDirContext(le);
    lc.close();
    }
3 голосов
/ 20 февраля 2009

Вы можете проверить, используя JNDI и LDAP (при условии, что вы используете LDAP / Active Directory для проверки). Проверьте эту тему для более подробной информации о том, как это сделать.

0 голосов
/ 16 ноября 2009

В этом примере http://spnego.sourceforge.net/pre_flight.html, говорится о программе HelloKDC.java, в которой единственное, что она делает, - это аутентификация имени пользователя и пароля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...