Piszę pytanie tutaj, bo nie udało się znaleźć rozwiązanie się przez kilka miesięcy. Moja sytuacja: Mam aplikację klient-serwer napisaną na java, która używa Java2ee 6 i EJB3.0. Strona serwera jest wdrożona na glassfish 3.0. Muszę opracować/wdrożyć moduł logowania do aplikacji. Uwierzytelnienie musi zostać wykonane przy użyciu serwera LDAP, a autoryzacja będzie obsługiwana w aplikacji. Dlatego chcę wynająć technologię JAAS do mieszania uwierzytelniania i autoryzacji. Robię to na przykład jak here. Potem wykonaj this tutorial i official documentation wykonać logowanie. Mój problem polega na tym, że logowanie ldap nie działa.JAAS konfiguracja i LDAP moduł logowania w JavaEE 6
Mój kod:
LoginContext lc = null;
try {
CallbackHandler handler = new CallbackHandler() {
public void handle(Callback[] callbacks) throws UnsupportedCallbackException {
for(int i = 0; i < callbacks.length; i++) {
if(callbacks[i] instanceof NameCallback) {
// prompt the user for a username
NameCallback nc = (NameCallback)callbacks[i];
nc.setName("admin");
System.out.println("Login done.");
} else if(callbacks[i] instanceof PasswordCallback) {
// prompt the user for sensitive information
PasswordCallback pc = (PasswordCallback)callbacks[i];
pc.setPassword("mypassword".toCharArray());
System.out.println("Password done.");
} else {
throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
} //end if/else
} //end for()
}
};
lc = new LoginContext("myAuth", handler);
lc.login();
Subject subject = lc.getSubject();
} catch (LoginException e) {
e.printStackTrace();
}
Mój plik konfiguracyjny JAAS:
myAuth {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED
userProvider="ldap://mydomain:389/OU=users,DC=my,DC=domain,DC=com"
authIdentity="{USERNAME}"
useSSL=false
debug=true;
};
Część klient aplikacja jest uruchamiana z następujących JVM opcji:
-Djava.security.auth.login.config=./jaas.conf -Dorg.omg.CORBA.ORBInitialHost=localhost
Na GlassFish miejscu I ustawić właściwości JVM
-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf
-Djava.naming.referral=follow
Plik login.conf na GlassFish stronie zawiera następujące wiersze (ADRealm jest domyślnym sfera mojego GlassFish)
ADRealm {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED;
};
Ustawienia ADRealm:
<property name="jaas-context" value="ldapRealm" />
<property name="base-dn" value="CN=users,DC=my,DC=domain,DC=com" />
<property name="directory" value="ldap://mydomain:3268" />
<property name="search-bind-password" value="mypassword" />
<property name="search-bind-dn" value="[email protected]" />
Chcę stresu twoja uwaga, że próbuję wykonać login ldap przynajmniej żeby się upewnić, że to działa.
Kiedy uruchomić klienta pojawia się następujący błąd: (!)
Mar 1, 2013 1:36:44 PM com.sun.appserv.security.AppservPasswordLoginModule extractCredentials
SEVERE: passwordlm.nopwdcred
javax.security.auth.login.LoginException: No credentials.
Co jest dziwne, że przerabia raz, to mogę uzyskać subject
z lc.getSubject()
metody. Również zakładam, że handle()
powyżej metoda nie jest wywoływany, ponieważ nie widzę
Login done.
Password done.
na wyjściu.
Proszę może ktoś mi pomóc ???
Przyjrzyj się dobrze w tej doskonałej [odpowiedzi] (http://stackoverflow.com/questions/2206911/best-way-for-user-authentication-on-javaee-6-using-jsf-2-0/2207147#2207147), aby uzyskać informacje na temat uwierzytelniania JAAS. – skuntsel
Zobacz tutaj: http://docs.oracle.com/javase/6/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/LdapLoginModule.html: "authIdentity = auth_id Ta opcja określa tożsamość, która ma być używana podczas uwierzytelniania użytkownika w katalogu LDAP ... Uwaga: jeśli ta opcja nie zawiera nazwy wyróżniającej, należy również podać opcję userFilter. " Czy próbowałeś dodać opcję userFilter? – Dikla