C#_Rookie Geschrieben 1. September 2009 Geschrieben 1. September 2009 Moinmoin, ich brauche ein kleinwenig Unterstützung für mein Java-Projekt. Meine HQL-Abfragen laufen soweit, ich kann die User aus einer AD-Gruppe abfragen,...passt soweit alles. Allerdings stehe ich nun vor einem konkreten Problem dessen Ablauf folgender masen aussieht: Wenn ein User bestimmte Kriterien erfüllt, wird ihm eine spezielle AD-Gruppe zugeordnet Bei der nächsten Anmeldung bekommt er dann eine Meldung auf dem Bildschirm angezeigt, die er bestätigen muss Das Bestätigungsdatum wird zurück in die Datenbank geschrieben Die Gruppe wird dem User wieder entzogen Mir geht es nun darum wie ich diese AD-Gruppe dem User zuordnen und wieder entziehen kann. Reicht es, wenn ich bei dem User einen zusätzlichen Eintrag mit dieser Gruppe mache oder muss ich da wirklich hin- und herkopieren? Bei uns im Betrieb kann mir da keiner so richtig Unterstützung geben, da dies eine komplett neue Anforderung ist. Gegoogelt habe ich auch schon, finde aber oft nur etwas zum Thema 'Infos aus AD auslesen'. Ich möchte nicht dass man mir hier einfach fix und foxy den kompletten Code reinstellt Es würde mir schon sehr helfen wenn jemand nützliche Links / Denkanstöße posten würde. thx a lot Zitieren
kingofbrain Geschrieben 1. September 2009 Geschrieben 1. September 2009 Servus, Du sagst leider außer dem Stichwort "HQL" nichts über die verwendeten Technologien. Meine Kristallkugel sagt mir allerdings, dass Du mit Hibernate 2.5 ohne JPA arbeitest. Wenn das nicht der Fall ist, dann sag Bescheid, dann justier ich die Kugel entsprechend nach. Bei Hibernate ist es so, dass Du bei einem einer aktuellen Hibernate Session zugehörigen (-> attached) Objekt arbeitest, wie Du sonst auch mit Objekten arbeiten würdest: Du änderst Attribute der Objekte. Das heißt in Deinem Fall, Du fügst die Gruppe hinzu oder entfernst sie. Wenn Du jetzt die Session verlässt / beendest, dann wird von Hibernate der Zustand der Objekte in den persistenten Zustand übernommen. Bei Hibernate mit JPA ist das ganze marginal anders, aber das ist eine andere Geschichte. Schöne Grüße, Peter Zitieren
C#_Rookie Geschrieben 1. September 2009 Autor Geschrieben 1. September 2009 @kingofbrain: Es geht mir nicht um die HQL Geschichte! Es geht mir um Java <->Active Directory! Ich habe noch ein wenig gegoogelt und dabei folgendes gefunden: memberOf is not a "real" attribute per se, meaning that it is read only, it contains "links" to groups and that it is constructed from all the groups that the user is a member of in that domain. The reason why it has links to groups is to ensure referential integrity Eg. if you delete, rename or move a user, the group's membership is correctly maintained. it is read-only, and if you attempt to modify it's values you wil get a LDAP Error of the form: javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000209A: SvcErr: DSID-031A0DD1, problem 5003 (WILL_NOT_PERFORM),data 0]; Was mir zu denken gibt ist der Satz "it is read-only"...! Bedeutet das, dass ich überhaupt nicht die Möglichkeit habe mit Java eine LDAP-Abfrage zu erstellen, welche den User der Active-Directory Gruppe zuordnet und wieder entfernt? Zitieren
robotto7831a Geschrieben 1. September 2009 Geschrieben 1. September 2009 Hallo, ich habe mich vor längerer Zeit mal mit dem Thema beschäftigt und nach dem kramen im Hinterstübchen kam heraus, dass man der Gruppe dem User zuordnen muss und nicht dem User die Gruppe. Lange Rede kurzer Satz: Der LDAP Gruppe muss der User über modify hinzugefügt werden. Frank Zitieren
C#_Rookie Geschrieben 2. September 2009 Autor Geschrieben 2. September 2009 @robotto: Jo, da hast du recht. Falsche Formulierung meinerseits. Und wenn du jetzt noch ein wenig mehr in deinem Hinterstübchen kramen würdest und mir noch zusätzlich zu meinem eigentlichen Problem 'nen guten Tip geben könntest? Es soll dir auch mir reichlich Kindersegen vergolten werden Zitieren
C#_Rookie Geschrieben 2. September 2009 Autor Geschrieben 2. September 2009 War zwar ein hartes Stück Arbeit aber zumindest bin ich mal soweit gekommen: private void addUserToGroup(LDAPAccess ldapAccess) throws Exception { try { LdapContext ctx = new InitialLdapContext(); ModificationItem[] mods = new ModificationItem[1]; mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("member", userDN)); ctx.modifyAttributes(Name der Gruppe, mods); ctx.close(); } catch (NamingException e) { System.err.println("User konnte der Gruppe (Name der Gruppe) nicht zugeordnet werden: " + e); } Im Parameter ldapAcces sind meine ganzen Anmeldeinfos für den LDAP-Server hinterlegt. Leider springt mir das ganze immer in die Exception. Es liegt wahrscheinlich daran dass ich, irgendwo im Code, den ldapAccess mitgeben muss. Nur: Ich habe keinen Schimmer an welcher stelle genau...?? Peinlich :old Zitieren
C#_Rookie Geschrieben 2. September 2009 Autor Geschrieben 2. September 2009 (bearbeitet) Kann es sein das ich für's Hinzufügen und Entfernen des Users aus der Gruppe nicht das ctx.modifyAttributes() benötige sondern mit ctx.bind()/ctx.unbind() das ganze bewerkstelligen muss? Wäre super wenn jm. mir diese Frage beantworten könnte. Zumindest rennt das ganze nun durch ohne Fehler. Ob die Aktuallisierung gelaufen ist kann ich noch nicht sagen, muss auf die Replikation des Servers warten. Mein aktueller Quellcode sind nun so aus: private void addUserToGroup(LDAPAccess ldapAccess) throws Exception { try { ModificationItem[] modItem = new ModificationItem[1]; modItem[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("memberOf", userDN)); Hashtable ht = new Hashtable(); //Wird nur benötigt wenn man von extern zugreifen möchte /*env.put(Context.INITIAL_CONTEXT_FACTORY, "entsprechendes jar-File");*/ ht.put(Context.SECURITY_AUTHENTICATION, "simple"); ht.put(Context.SECURITY_PRINCIPAL, ldapAccess.getBrowseUser()); ht.put(Context.SECURITY_CREDENTIALS, ldapAccess.getBrowsePassword()); //Der entsprechende Domänen-Controller mit Port ht.put(Context.PROVIDER_URL, "server : port"); LdapContext ctx = new InitialLdapContext(ht, null); ctx.bind("hier steht der entspr. dn", modItem); } catch (NamingException e) { System.err.println("User konnte der Gruppe xxx nicht zugeordnet werden: " + e); } } Bearbeitet 2. September 2009 von C#_Rookie Zitieren
robotto7831a Geschrieben 2. September 2009 Geschrieben 2. September 2009 Schau dir mal den Link an. Dort sind verschiedene Beispiele u. a. für User zur Gruppe hinzufügen und löschen. http://forums.sun.com/thread.jspa?threadID=581444 Frank Zitieren
C#_Rookie Geschrieben 3. September 2009 Autor Geschrieben 3. September 2009 Schau dir mal den Link an. Dort sind verschiedene Beispiele u. a. für User zur Gruppe hinzufügen und löschen. Naming and Directory (JNDI) - JNDI, Active Directory and Group Memberships Frank @robotto: Und ich sah, dass es gut war! Vielen herzlichen Dank, hat funktioniert. Und das schöne ist, dass ich DirContext.ADD_ATTRIBUTE auch einfach in DirContext.REMOVE_ATTRIBUTE ändern kann... Nur: Eine Zeile ist mir nicht ganz klar wofür sie steht/was sie macht. Das ich sie brauche ist mir klar, denn sobald ich sie auskommentiere funzt das ganze nicht mehr. env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.