Zugriffsbeschränkung für Dokument

  • Hi,
    für den Zugriff auf eine DB habe ich den Nutzern Rollen zugeordnet.
    Nun möchte ich, das man für jedes Dokument angeben kann,
    ob Nutzer einer bestimmten Rolle dieses Dokument öffnen können.


    Hat jemand eine Idee, wie das so einfach wie möglich zu realisieren ist?


    Meine Idee:
    in der Maske ein Optionsfeld definieren, mit dem man den Zugriff
    für diese Gruppe sperren kann.
    Dieses Optionsfeld wird nur den Leuten angezeigt, die NICHT in der "gesperrten" Rolle sind.
    Beim öffnen des Dokumentes wird dann die Rollenzuordnung geprüft und evtl. die Öffnung abgebrochen.
    Nun muß ich nur noch wissen, wie man den Wert eines Feldes im aktuellen Dokument ausließt - und da stoße ich an meine Grenzen.


    Sub Initialize
    Dim ws As New notesuiworkspace
    Dim uidoc As Notesuidocument
    Set uidoc = ws.currentdocument
    Dim inhalt as string
    inhalt=uidoc.FieldGetText("Hidden")
    End Sub


    Dabei kommt immer "Objektvariable nicht gesetzt".

  • Mit dem von Dir gewählten Script kriegst Du das im "Initialize" nicht hin. Das müsstest Du ins Event "Postopen" schreiben. Dann kannst Du den Feldinhalt auf diese Weise auslesen und anschliessend das Dok wieder schliessen.


    Noch eine kleine Frage: Sollen die "nicht berechtigten User" nicht lesen dürfen, was in dem Dokument steht? Dann ist das ein nicht ganz zielführender Weg, sie am öffnen zu hindern. Über die Eigenschaften des Dokuments können sie dann doch wieder die Inhalte der Felder lesen. Besser wäre in diesem Fall die Dokumente mit einem Leserfeld zu versehen. Dann werden die Dokumente nur noch den Leuten angezeigt, die der entsprechenden Rolle zugeordnet sind.

  • Danke für die schnelle Antwort.
    Habe garade auch herausgefunden, das es mit "Postopen" funktioniert:


    Sub Postopen(Source As Notesuidocument)
    Dim ws As New notesuiworkspace
    Dim uidoc As Notesuidocument
    Set uidoc = ws.currentdocument
    If(uidoc.FieldGetText("Hidden")="gesperrt") Then
    Msgbox "Sie sind zur Anzeige dieses Dokumentes NICHT berechtigt.",,"Zugriff verweigert"
    Call uidoc.Close
    End If
    End Sub


    Das Optionsfeld zur Angabe ob gesperrt oder erlaubt habe ich mit der Formel
    @IsMember("[Fremdmitarbeiter]";@UserRoles)
    ausgeblendet, damit nur "berechtigte" Nutzer dieses Feld ändern können.
    Nun ist mein letztes Problem, wie bekomme ich die Informationen der @-Funktion in LotusScript realisiert?


    zur Information:
    Die Dokumente haben meist keinen (oder nicht viel) Text. Die sensiblen Inhalte liegen in Anhängen.
    Deshalb reicht es mir eigentlich aus, wenn die "nicht berechtigten" Nutzer die Anhänge nicht öffnen können.


    >>> Besser wäre in diesem Fall die Dokumente mit einem Leserfeld zu versehen.
    >>> Dann werden die Dokumente nur noch den Leuten angezeigt, die der entsprechenden Rolle zugeordnet sind.
    Das mit dem Lesefeld habe ich nicht ganz verstanden.
    Ich kenne nur die Möglichkeit, über "Eigenschaften > Dokument > Sicherheit > wer kann dieses Dok. lesen" die Leserechte
    einzuschränken.
    Ich möchte aber den "berechtigten" Nutzern die Möglichkeit geben, aus der Maske heraus dieses Lesefeld zu setzten/löschen.

  • Freut mich das es schon mal mit dem öffnen/ nicht öffnen geklappt hat. Den Rest kriegen wir bestimmt auch noch hin


    Zitat

    Das Optionsfeld zur Angabe ob gesperrt oder erlaubt habe ich mit der Formel
    @IsMember("[Fremdmitarbeiter]";@UserRoles)
    ausgeblendet, damit nur "berechtigte" Nutzer dieses Feld ändern können.
    Nun ist mein letztes Problem, wie bekomme ich die Informationen der @-Funktion in LotusScript realisiert?


    Welche Informationen aus der @-Funktion willst Du wo über Script realisieren? Und warum willst Du unbedingt als Script realisieren?



    [/quote]
    Das mit dem Lesefeld habe ich nicht ganz verstanden.
    Ich kenne nur die Möglichkeit, über "Eigenschaften > Dokument > Sicherheit > wer kann dieses Dok. lesen" die Leserechte
    einzuschränken.
    Ich möchte aber den "berechtigten" Nutzern die Möglichkeit geben, aus der Maske heraus dieses Lesefeld zu setzten/löschen.
    [/quote]


    Du kannst in Notes per Design in der Maske auch schon vorgeben, wer ein Dokument überhaupt lesen darf. Dazu fügst Du in der Maske ein Feld des Typs "Leser" ein. Ist dieses leer hat es keine Fuktion. Ist es allerdings gefüllt bewirkt es, das es nur noch dem eingetragenen Leserkreis zugänglich ist. Das funktioniert auch mit ACL-Rollen. Man sollte aber halt vorsichtig sein. Denn diese Lesebeschränkungen beziehen sich auch auf Server!. Deshalb immer dem Server diese Leserollen zuteilen. Sonst: AuWeia!! ;)
    Du kannst dieses Feld auch Bearbeitbar machen. Dazu gibst Du einfach als Dialogliste Deine ACL-Rollen ein. Dann können die berechtigten Nutzer die Rolle eintragen.


    Ich hoffe, ich konnte Dir damit helfen

  • Hi,
    genau diesen Tip habe ich gebraucht.
    Wenn ich die Sache über das Feld vom Typ "Leser" realisiere,
    kann ich mir den Rest sparen.
    Genauso mach ich es!
    Trotzdem würde mich noch interessieren, wie ich über LScript herausbekomme, welcher Rolle der gerade aktive Nutzer zugeordnet ist (also wie bei @UserRoles).
    In der Designer-Hilfe finde ich keinen Verweis von den @-Funktionen auf gleichwertige LScript-Funktionen.
    Vielen Dank.

  • Entweder das, oder Du musst (recht umständlich) die ACL auslesen. Das ist aber erheblich mehr als ein 1 - 2 zeiliges Evalute.


    Ansonsten gern geschehen. Freut mich das es klappt.
    Schönes Wochenende

  • Jetzt habe ich eine komplette Lösung für mein Problem:
    (für alle, die ein komplettes Beispiel suchen)


    In der Zugriffsliste den Nutzern Rollen zuordnen.
    z.B. "externeMitarbeiter" für Personen, die nicht alle Dokumente lesen können sollen.


    In der Maske ein Feld "Hidden" erzeugen, mit dem man als Optionsschaltfläche
    den Wert zwischen "erlaubt" und "gesperrt" wechseln kann.


    Dieses Feld wird bei folgender Formel ausgeblendet:
    @IsMember("[externeMitarbeiter]";@UserRoles)


    So können nur "interne" Mitarbeiter diesen Wert ändern.


    Damit beim Aufruf des Dokumentes die Rollenzugehörigkeit überprüft werden kann,
    in "Postopen" folgende Zeilen einfügen:


    Sub Postopen(Source As Notesuidocument)
    Dim ws As New notesuiworkspace
    Dim db As NotesDatabase
    Dim session As New NotesSession
    Dim uidoc As Notesuidocument
    Dim acl As NotesACL
    Dim entry As NotesACLEntry
    Set db = session.CurrentDatabase
    Set uidoc = ws.currentdocument
    Set acl = db.ACL
    Set entry = acl.GetEntry(session.UserName)
    If (entry.IsRoleEnabled("externeMitarbeiter") And uidoc.FieldGetText("Hidden")="gesperrt") Then
    Messagebox("Sie besitzen nicht die nötige Rolle, um diese Dokument zu lesen.")
    Call uidoc.Close
    End If
    End Sub


    Von Nachteil ist vieleicht noch, das man das Dokument erstmal angezeigt bekommt. Wenn also
    doch "sensible" Inhalte im Dokument stehen, dann kann man die erstmal sehen, bis man das
    Dialogfenster (und damit auch das Dokument) wieder schliesst.
    Da bei meinem Fall aber alle "sensiblen" Inhalte in Dateianhängen vorliegt, geht es auch so.

  • Wenn Du umgehen willst, das das Dokument überhaupt angezeigt wird, dann setz den Code mit kleinen Änderungen einfach in den QueryOpen.


    Dim db As NotesDatabase
    Dim session As New NotesSession
    Dim doc As Notesdocument
    Dim acl As NotesACL
    Dim entry As NotesACLEntry
    Set db = session.CurrentDatabase
    Set doc = source.document
    Set acl = db.ACL
    Set entry = acl.GetEntry(session.UserName)
    If (entry.IsRoleEnabled("externeMitarbeiter")And doc.Hidden(0)="gesperrt") Then
    Messagebox("Sie besitzen nicht die nötige Rolle, um diese Dokument zu lesen.")
    continue = False
    End If



    Damit wird das ganze Dokument gar nicht erst geöffnet.

  • Guten Morgen,


    eine kleine Frage:


    Wenn man das ganze mit Leserfelder realisiert, wird es genauso gemacht wie von lono007 angegeben?


    Also Leserfeld in Maske erzeugen. In dieses Leserfeld eine Rolle setzten. Und dann im QueryOpen prüfen, ob diese Rolle im Leserfeld steht. Oder macht Notes das beim Öffnen automatisch, wenn ein Dokument ein Leserfeld beinhaltet?
    Oder hab ich nur den Vorteil, dass ich dann ein fertig generiertes Dialogfeld zur Verfügung habe.

  • Ein gefuelltes Leserfeld bewirkt, dass nur der/die das Dok lesen koennen, die dort aufgelistet sind (einschl. User in Autorenfeldern)
    Wie dort ein Wert reinkommt, bleibt dem Entwickler ueberlassen.

  • @devileye1:
    Nicht das Du da was falsch verstehst:
    Auf die Art wie oben beschrieben ist das Dokument nicht über ein Leserfeld geschützt. Das was lono007 da gemacht hat ist nur, das dieses Dokument nicht mehr von Usern geöffnet werden kann wenn sie diese Rolle nicht haben.
    Wäre dieses Feld ein echtes Feld vom Typ "Leser", dann würde das Dokument nicht-berechtigten Usern gar nicht angezeigt.


    Bei der obigen Methode wird den Usern nur die Möglichkeit gegeben, bestimmten (anderen) Personen das öffnen des Dokuments zu verbieten. In den Ansichten ist es aber trotzdem noch vorhanden! (was bei lesegeschützten Dokumenten nicht der Fall ist!)

  • helmie:
    Das hatte ich schon so verstanden wie es gemeint war. Ich hatte mich halt nur gefragt, warum man es nicht gleich mit Leserfeldern macht. Dadurch hätte man sich das alles ein bisschen einfacher machen können. Jedenfalls bin ich inzwischen der Ansicht. Habe es mal mit beiden Varianten versucht (hab noch nie mit Leserfeldern gearbeitet). Einmal Dokument verbergen mit Leserfeldern und nach lono007- Variante. Ich bevorzuge nun Leserfelder, da man dadurch als Endanwender nicht so sehr das Gefühl hat ausgegrenzt zu werden. Man sieht wirklich nur das, was man sehen soll. Keine Kritik an lono007.


    noch ne Frage.


    Du hast geschrieben:


    "Man sollte aber halt vorsichtig sein. Denn diese Lesebeschränkungen beziehen sich auch auf Server!. Deshalb immer dem Server diese Leserollen zuteilen. Sonst: AuWeia!! "


    Der Server muss also immer diese Leserechte haben. Egal ob ich ihm ne Rolle zuteile oder ihn in das Leserfeld schreibe. Egal wie, aber er brauch die Rechte! Stimmt das so? Was passiert wenn nicht?



    Vielen Dank, für die Erläuterung!

    • Offizieller Beitrag

    der Server braucht Rechte das Dokument zu lesen, sonst kann er es nicht replizieren.
    Deshalb würde ich in die Maske ein 2. berechnetes Leser-Feld einbauen und dort eine Rolle reinschreiben (z.B. "[lesenAlles]). Diese Rolle bekommt dann der NotesServer, damit hat er wieder Rechte das Dokument zu lesen.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Da muss ich Dir Recht geben. An den ersten 100 hab ich mich ziemlich schwer getan. Aber ab jetzt kann es ja nur noch besser werden... :D

  • Wunderbar!
    Wie "helmie" es beschrieben hast, funktioniert es jetzt auch ohne das das Dokument vorher angezeigt wird.


    Mag sein, das es mit Lesefeldern besser zu realisieren ist, aber damit habe ich noch keine Erfahrungen.


    Trotzdem Danke an alle !!!