Domino 9 und frühere Versionen > ND8: Entwicklung

Ermitteln der "sichtbaren" Dokumente für beliebige Benutzer

<< < (2/2)

Tode:
Nun: Du könntest Dir eine "@UserNamesList"- Funktion bauen, um alle Gruppen zu bekommen, in denen der Benutzer drin ist. Dann über NotesDatabase.QueryAccessRoles( username ) die Rollen des Users ermitteln, und dann über NotesDatabase.Search( {DeineLeserFelder : DeineAutorenFelder *= UserGruppen : UserRollen} ) die Dokumente finden.

Search ist relativ schnell, und die Gruppenmitgliedschaften kannst Du zur Not ja irgendwo cachen, falls das ermitteln zu lange dauert...

EDIT: Wegen UserNamesList: Unter Umständen hilft Dir der GroupManager weiter. Ich habe den grade beim Googeln über diese Stackexchange- Seite gefunden.

Sven Hasselbach:
Mit einem OSGi-Servlet könntes Du den Request im Context eines beliebeigen Users laufen lassen.
Beispielcode findest Du hier:
https://github.com/hasselbach/domino-stateless-token-servlet/blob/master/src/ch/hasselba/servlet/DominoStatelessTokenServlet.java

Der entscheidende Part ist in der Methode createUserSession.

ghostmw:
Vielen Dank an alle und dickes Dankeschön an Torsten.

Das war der entscheidende Hinweis. Die GroupManager-Klasse brachte den entscheidenen Hinweis und damit den Erfolg.

Einmal das NAB (names.nsf) des Servers laden lassen, dann alle gecacheden Gruppen durchlaufen, die neue Funktion hasMember (ist noch zu schreiben) prüfen und los gehts mit dem Auflisten der Gruppen, wo der User enthalten ist.


--- Code: --- Dim groupMan As New NotesGroupManager(True)

.... ' weitere Deklarationen

Set db = session.Currentdatabase    

Set dbNAB = session.getDatabase ( db.Server , "names.nsf" )

Call groupMan.LoadAddressBook(dbNAB)

strNotesUserName = "CN=Hugo Test/OU=xy/O=z"

' den Notesname im CN-Format und alle seine Rollen auf der aktuellen DB im Array hinterlegen
varGroups = FullTrim ( ArrayAppend ( Split ( strNotesUserName, Chr$(1) ), db.QueryAccessRoles(strNotesUserName) ) )

Call groupMan.LoadAllGroups()

ForAll varGroup In groupman.CachedGroups()
Set group = varGroup
If Not group Is Nothing Then
Select Case group.Type
Case "0", "2" :     ' nur Multi-Purpose und ACL only-Gruppen benutzen
If group.hasMember ( strNotesUsername ) Then varGroups = ArrayAppend ( varGroups, group.Name )
End Select
End If
End ForAll

' in varGroups sind nun alle Gruppen drin, zusammen mit dem CN-Format des Notesnamens und aller Rollen auf der aktuellen DB, damit kann man gegen die Autoren- und Leserfelder prüfen.

--- Ende Code ---

Die Methode hasMember benutzt die Eigenschaft AllMembers, um der übergebenen Notesnamen (canonisches Format CN=...) im Array zu suchen und den Erfolg/Misserfolg zurückzuliefern.

Das Problem ist erfolgreich in LotusScript gelöst und sehr performant.

Marco

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln