LDAP-címtárlekérdezés: Miért nem ér semmit a szűrő?!

0 votes
asked Mar 31, 2014 in IRF tantárgy by Pietro (72 points)  

Sziasztok!

Bár tudom, hogy a leadási határidőn túl vagyunk, van egy kérdés, ami akkor sem hagy nyugodni, muszáj megkérdeznem, hátha tudja valaki rá a választ. :D

Van a Projects részfán belül a Projectsstaff entry, amire bár a gyakorlaton megbeszéltük, hogy nincs szükség, mégis kísérletezés gyanánt bent hagytam, pont azért, hogy "foolproofabbá" tudjam tenni a lekérdezéseimet.

Lényeg röviden (TL;DR):

Az (&(objectClass=top)(objectClass=groupOfNames)) filter hatástalan; azokat az elemeket is kilistázza (most konkrétan csak egyet, a Projectsstaff entry-t), amelyeknél csak objectClass=groupOfNames tulajdonság van jelen, az objectClass=top NINCS.

Miért?

Szépen kifejtve, screenshotokkal

Itt látszik a Projectsstaff entry:

Projectsstaff entry

Látható, hogy itt jelen van az objectClass=groupOfNames attribútum-érték páros, de az objectClass=top NEM.

Akármelyik másik projekthez tartozó entry-t megnézzük, annál jelen van mindkettő attribútum-érték páros, vagyis az objectClass=groupOfNames ÉS az objectClass=top is:

Mindkét attribútummal rendelkezik

És akkor most arra szeretném szűrni a **Projects részfát, hogy csak azokat a bejegyzéseket listázza ki, amelyeknél mindkettő említett attribútum jelen van**, ezért készítek egy filtert:

search base:

ou=Projects,dc=irf,dc=local

filter:

(&(objectClass=top)(objectClass=groupOfNames))

magyarul ÉS-kapcsolat van a kettő közt:

Keresés szűrővel

Ennek ellenére az eredménylistában mégis látszik a Projectsstaff, pedig nála nincs jelen az objectClass=top tulajdonság!

Lásd itt:

Projectsstaff látszik az eredménylistában

Python-kóddal próbáltam, ugyanez a helyzet (mondjuk nem túl meglepő).

Abban az esetben működik csak az, hogy kiszűrjem a találatokból a Projectsstaff entry-t, ha kiszűröm a member=cn=nobody,dc=irf,dc=local tulajdonsággal rendelkezőeket...
Tehát így néz ki a filter:

(&(!(member=cn=nobody,dc=irf,dc=local))(&(objectClass=top)(objectClass=groupOfNames)))

Szebben formázva:

(&
    (!(member=cn=nobody,dc=irf,dc=local))
    (&
        (objectClass=top)
        (objectClass=groupOfNames)
    )
)

Esetleg Python-kódból:

projectNames = conn.search("ou=Projects,dc=irf,dc=local", 1,
                           "(&(!(member=cn=nobody,dc=irf,dc=local))(&(objectClass=top)(objectClass=groupOfNames)))",
                           ['cn'])

Na de miért nem megy az elvártak szerint az első filterrel, vagyis simán csak azzal, hogy (&(objectClass=top)(objectClass=groupOfNames))?

Tudom, hogy hosszú lett így képekkel a kérdés, de hátha mégis van valakinek türelme hozzá. Előre is köszi!

1 Answer

+1 vote
answered Mar 31, 2014 by nadudvarit (1,121 points)  
selected Mar 31, 2014 by Pietro
 
Best answer

Röviden: Amennyire én tudom a top a legfelsőbb objectClass, abból származik minden más, így arra szűrni hogy kinek van ilyen objectClass-a szerintem értelmetlen.

Kicsit kifejtve: Ami érdekesebb, hogy a "valami"+staff nevű entryknek nincs listázva a top. Ez tulajdonság szerintem a generálás közben nem lett hozzáadva, viszont Directory Studioban nem enged új groupOfNames típusú entryt felvenni top nélkül. A groupOfNames-nek viszont ha megnézed neten a leírását kiderül, hogy a top az "ősosztálya".

Ezután elkezdtem azon gondolkodni, hogy hogyan befolyásolja az öröklődés a keresést. Kerestem egy olyan objectClass-ot, aminek nem a top közvetlenül az ősosztálya. Ilyen például a organizationalPerson, aminek a person az őse. Pythonba készítettem egy olyan entryt, aminek kizárólag az organizationalPerson szerepel az objectClass attribútumainál (Apache-val ilyet nem lehet, hozzáadja a többit (top, ...) is). Majd ezután rákerestem a részfára a (objectclass=person) szűrővel. Az eredményben megjelent a frissen felvett entrym. Ebből arra tudok következtetni, hogy objectClass szűrésnél a leszármazottakat is megtalálja.

Ez alapján igencsak helytálló ennek a válasznak az első mondta.

commented Mar 31, 2014 by Pietro (72 points)  
Köszi szépen a részletes választ, és hogy foglalkoztál vele! Eleinte ezt így nem fogtam fel, de a magyarázatod után már teljesen logikus (mármint hogy értelmetlen volt a szűrésem :) ).

Kapcsolódva még a konkrét esethez, ezt már csak érdekességként kérdezem: létezik olyan szűrő, amivel csak azokat a találatokat kapom meg, amiknek pl. a member attribútuma több értéket is tartalmaz, nem csak egyet? (Nem mintha a konkrét feladatnál ez feltétlenül jó lenne, mert ki tudja, lehet, hogy egy projektnél csak pontosan egy egyetemi munkatárs van, és kész, őt is szeretnénk megtalálni. :) ) Vagy ezt már posztoljam új kérdésként? :)

(OFF: esetleg a következő kérdéssel kapcsolatban van valami meglátásod? --> http://q2a.inf.mit.bme.hu/1086/projektnek-felhasznalo-felesleges-halozati-forgalom-elkerulese (bár megértem, ha nincs kedved vele foglalkozni, mert elég hosszú, de hátha eszedbe jutott ezzel kapcsolatban valami :D) )
...