ADS LDAP unknown protocol: ldap jak naprawić?

0

Witam, zaczynam dopiero prace z LDAP, korzystam z ApacheDirectoryStudio. utworzyłem nowy LdapServer oraz zaimportowałem gotowy plik LDIF. Chce sprobowac wykonywac rozne operacje jednak program rzuca wyjątki z którymi nie wiem jak sobie poradzić, nigdzie nie mogę znaleŹĆ żadnych informacji na ten temat. Czy ma ktoś jakiś pomysł?

Tworzę sobię prostą klasę i chcę np wyświetlic jakies dane:

import java.util.Hashtable;

import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;


public class ContextExample {

	public static void main(String[] args) throws NamingException {
		
		Hashtable<String,String> env = new Hashtable<String, String>(); 
		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
		env.put(Context.PROVIDER_URL, "ldap://localhost:10389/o=jEdu");
		
		DirContext context = new InitialDirContext(env);
		
		NamingEnumeration<Binding> enumeration = context.listBindings("");
		while(enumeration.hasMore()) {
			System.out.println(enumeration.next().getName());
		}
		
		
	}
}

A tutaj błędy:

 
Exception in thread "main" javax.naming.InvalidNameException: ldap://localhost:10389/o=jEdu [Root exception is java.net.MalformedURLException: unknown protocol: ldap]
	at com.sun.jndi.fscontext.FSContextFactory.getFileNameFromURLString(FSContextFactory.java:119)
	at com.sun.jndi.fscontext.RefFSContextFactory.createContext(RefFSContextFactory.java:41)
	at com.sun.jndi.fscontext.RefFSContextFactory.createContextAux(RefFSContextFactory.java:47)
	at com.sun.jndi.fscontext.FSContextFactory.getInitialContext(FSContextFactory.java:49)
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
	at javax.naming.InitialContext.init(InitialContext.java:244)
	at javax.naming.InitialContext.<init>(InitialContext.java:216)
	at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:101)
	at ContextExample.main(ContextExample.java:20)
Caused by: java.net.MalformedURLException: unknown protocol: ldap
	at java.net.URL.<init>(URL.java:593)
	at java.net.URL.<init>(URL.java:483)
	at java.net.URL.<init>(URL.java:432)
	at com.sun.jndi.fscontext.FSContextFactory.getFileNameFromURLString(FSContextFactory.java:117)
	... 9 more

0

użyj **InitialLdapContext **zamiast InitialDirContext

0

niestety nawet przy użyciu InitialLdapContext efekt jest identyczny

1

A co Ty chcesz zrobić ? bo spring security wyposaża Cię z takie mechanizmy że żeby autentykować za pomocą LDPA wystarczy powiedzieć że chcesz i podlinkować odpowiedni plik z danymi.

https://spring.io/guides/gs/authenticating-ldap/

1

Zgadzam się z @niezdecydowany, że jeśli zależy Ci tylko na autentykacji / autoryzacji to Spring Security to dobra droga.

Wydaje mi się, że Ty potrzebuesz korzystać z bazy LDAP tzn. robić zapytania i czasem nawet modyfikacje (np. dodawac uzytkownika z poziomu Javy). Kiedyś robiłem takie rzeczy korzystając z biblioteki UnboundID LDAP SDK. https://www.ldap.com/unboundid-ldap-sdk-for-java

Jest ona na licencji LGPL, więc możesz używać jej bez obaw komercyjnie. Całkiem sprawnie to szło. API javax.naming.directory jest już mocno legacy i raczej nie jest zalecane do nowych projektów.

Tu masz sample i zobacz czy tego szukasz:
https://docs.ldap.com/ldap-sdk/docs/examples/index.html
https://docs.ldap.com/ldap-sdk/docs/javadoc/index.html

0

okej dziekuje bardzo za szybka odpowiedz. To co chce zrobic to raczej zapoznac sie mniej wiecej, poniewaz mam stary kod w ktorym byl uzyty ten mechanizm. Jeszcze jedno pytanie, chcialbym sie dowiedziec czy dobrze rozumiem.

Hashtable<String, String> authEnv = new Hashtable<String, String>();			
	
authEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory";
authEnv.put(Context.PROVIDER_URL, ldapUrl);
authEnv.put(Context.SECURITY_AUTHENTICATION, "simple");v 	
authEnv.put(Context.SECURITY_PRINCIPAL, "cn=login");				
authEnv.put(Context.SECURITY_CREDENTIALS, "pass");

try {
DirContext authContext = new InitialDirContext(authEnv);
...
} catch(Exception e){...}

Rozumiem to tak, tworze sobie mape parametrow, dodaje do niej odpowiednia wlasciwosci,
PROVIDER_URL - okresla sciezke do naszego pliku z parametrami
SECURITY_AUTHENTICATION - okresla poziom autentykacji (simple - czyli za pomoca loginu i hasla)
SECURITY_PRINCIPAL - nasz login
SECURITY_CREDENTIALS - nasze haslo

i teraz kiedy tworze kontekst w bloku try,catch podajac jako parametr wczesniej utworzona mape, zostanie zwrocony wyjatek jesli login lub haslo sa nie prawidlowe? Nie wiem czy dobrze to rozumiem, czy chodzi tutaj o cos innego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1