Autor Thema: ACL manipulieren  (Gelesen 2238 mal)

Offline Helge Jantzen

  • Frischling
  • *
  • Beiträge: 25
  • Geschlecht: Männlich
ACL manipulieren
« am: 20.06.06 - 14:15:54 »
Hallo,

ich hab eine Datenbank in der ich Personendokumente angelegt habe. Wann immer ein Dokument angelegt oder geändert wird wird der entsprechende Eintrag auch in der ACL angelegt oder geändert, so zumindest wenn man Manager der Datenbank ist. User die solche Personendokumente anlegen dürfen sind aber keine Manager der DB und sollen es auch nicht werden. Wie kann ich diesen Usern ermöglichen die ACL trotzdem zu ändern? Ich hab da mal was gelesen, das bestimmte Aktionen mit der ServerID ausgeführt werden, oder sowas in der Art. Hat einer ne Ahnung wie das genau war und kann mir da ein paar Hinweise geben?

Außerdem sollen User, deren Personendokumente gelöscht wurden natürlich auch aus der ACL verschwinden, ich hab da das Postdocumentdelete event im Datenbankscript ins Auge gefasst, kann das was geben oder bin ich auf dem Holzweg?

Deutschland wird Weltmeister!!   :D

Danke und Gruß
Helge

Offline Lossa

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.404
  • Geschlecht: Männlich
    • alphaTrain
Re: ACL manipulieren
« Antwort #1 am: 20.06.06 - 14:31:48 »
Hallo,

ich würde das so lösen:

1. User erstell ein Personendokument in der DB
2. Ein zyklischer, oder Ereignissgesteuerter Agent läuft auf dem Server unter der berechtigung des Servers oder eines Admins
3. Es muss ja dazu ein enstprechendes Dokument im names.nsf oder via Directory Assitance angebundenen Adressbuch ein Userdokument geben, dieses wird von dem Agent erstellt und der User wird in eine Gruppe eingetragen, diese Gruppe ist berechtigt auf die DB zuzugreifen.
Viele Grüße

Ulrich Lossa
Aktiv als Notes Admin und Entwickler seit Version 1.
Freier Trainer und Berater.
Zertifiziert für alle Versionen SA und DB.
HCL Certified Administrator
IBM Certified Advanced Application Developer (PCLP AD)
IBM Certified Advanced System Administrator (PCLP SA)
IBM Certified Instructor for System Administration and Application Development ( CLI)
IBM Certified Instructor for Websphere Software
IBM Certified Instructor for DB2
http://www.alphatrain.de
Lossa@alphatrain.de

Offline gossifu

  • Senior Mitglied
  • ****
  • Beiträge: 352
  • Geschlecht: Männlich
  • Dummheit schafft Freizeit
Re: ACL manipulieren
« Antwort #2 am: 20.06.06 - 14:35:46 »
Hallo,

schreibe einen Agenten der die ACL oder die Gruppe mit den Werten aus dem Dokument minipuliert.
Dann schreibst Du in Postsave des Dokuments den Agentenaufruf

Dim s as New NotesSession
Dim db as NotesDatabase
dim ag as Notesagent
'Das SourceDocument hast Du ja

Set db = s.CurrentDatabase
Set ag = db.GetAgent("Dein Agent")
Call ag.RunOnServer(Source.Document.NoteID)'Damit übergibst Du das Personendokument an den Agenten

Im Agent holst Du Dir dieses so:

Dim s as New NotesSession
Dim db as NotesDatabase
dim ag as Notesagent
Dim doc as NotesDocument

Set db = s.CurrentDatabase
Set ag = s.CurrentAgent
Set doc = db.GetDocumentByID(ag.ParameterDocID)

doc ist das Personendokument, aus dem Du den Namen auslesen kannst, der in die ACL oder wie mein Vorredner meint in die Gruppe der names.nsf (auch 'ne gute Idee).

Wichjtig, der Agent sollte mit der Server-ID signiert sein.

mfg

Kjeld

Immer lustig und vergnügt, bis der A.... im Sarge liegt. ;-)

Offline Helge Jantzen

  • Frischling
  • *
  • Beiträge: 25
  • Geschlecht: Männlich
Re: ACL manipulieren
« Antwort #3 am: 21.06.06 - 12:22:30 »
Danke, das war sehr hilfreich.

@Lossa: Ich hab mich am Anfang der Entwicklung der DB gegen Usergruppen im Adressbuch entschieden und auch wenn ich im Moment nicht mehr so ganz sicher bin warum möchte ich dabei bleiben. Ist ja auch eigentlich nicht das Problem die ACL zu manipileren.

@Kjeld: Hab ich alles so gemacht, hab leider noch nen Fehler drin.

Ich hab mal den Code angehängt vielleicht sieht einer von euch warum die folgende Meldung kommt.

---------------------------
Lotus Notes
---------------------------
Notes error: Im Hintergrund ausgeführter oder eingebetteter Agent verwendet einen nicht unterstützten Auslöser und Suchtyp
---------------------------
OK   
---------------------------

Hier mal der Code des Agenten:

Sub Initialize
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim ag As Notesagent
   Dim doc As NotesDocument
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   
   Set db = s.CurrentDatabase
   Set ag = s.CurrentAgent
   Set doc = db.GetDocumentByID(ag.ParameterDocID)
   Set acl = db.ACL
   
   Call db.GrantAccess( doc.GetItemValue("Pruefer_Name"),  ACLLEVEL_EDITOR)
   Set entry = acl.GetEntry( doc.GetItemValue("Pruefer_Name") )
   Call entry.DisableRole("QMB")
   Call entry.DisableRole("QUM-Koordinator")
   Call entry.DisableRole("QM-Bearbeiter")
   If Not (entry Is Nothing) Then
      entry.UserType = ACLTYPE_PERSON
      Call entry.EnableRole( doc.GetItemValue("Pruefer_Typ") )
      If ((doc.GetItemValue("Pruefer_Typ") = "QMB")) Then
         entry.CanDeleteDocuments=True
      End If
      Call acl.Save()
   End If
End Sub

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: ACL manipulieren
« Antwort #4 am: 21.06.06 - 18:31:26 »
Eventuell liegt es daran, dass du für den Zugriff auf die ACL-Einträge Variant-Typen und keine Strings verwendest.

Ändere mal den Code wie folgt ab:

Sub Initialize
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim ag As Notesagent
   Dim doc As NotesDocument
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   
   Set db = s.CurrentDatabase
   Set ag = s.CurrentAgent
   Set doc = db.GetDocumentByID(ag.ParameterDocID)
   Set acl = db.ACL
   
   Call db.GrantAccess( doc.Pruefer_Name(0),  ACLLEVEL_EDITOR)
   Set entry = acl.GetEntry( doc.Pruefer_Name(0) )
   Call entry.DisableRole("QMB")
   Call entry.DisableRole("QUM-Koordinator")
   Call entry.DisableRole("QM-Bearbeiter")
   If Not (entry Is Nothing) Then
      entry.UserType = ACLTYPE_PERSON
      Call entry.EnableRole( doc.Pruefer_Typ(0) )
      If doc.Pruefer_Typ(0) = "QMB" Then
         entry.CanDeleteDocuments=True
      End If
      Call acl.Save()
   End If
End Sub

Außerdem muss der Unterzeichner des Agenten auch die entsprechenden Rechte haben in der ACL Änderungen vorzunehmen.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: ACL manipulieren
« Antwort #5 am: 21.06.06 - 18:48:28 »
Hallo Axel,

dass mit den Nicht-Strings, sondern Arrays ist auf jeden Fall ein Fehler. Es müsste auf das erste Element des Arrays zurückgegriffen werden, es ginge also auch
Call db.GrantAccess( doc.GetItemValue("Pruefer_Name") (0),  ACLLEVEL_EDITOR).

A-Bär: Dahin kommt man ja erst gar nicht ... Der Agent startet gar nicht lt. Fehlermeldung.

Wie wird denn der Agent aufgerufen? Ich nehme an mit Agent.Run oder Agent.RunOnServer. Und dann wird wohl der falsche Agenttyp ausgewählt worden sein, denn hierfür eignen sich nur normalerweise vom Server getriggerte Agents (periodisch, so auch "Periodisch - Nie", jedoch keine Agents, die "Aus der Liste der Agenten" oder "Als Aktion" gestartet werden).

HTH,
Bernhard

Offline knoedel0815

  • Aktives Mitglied
  • ***
  • Beiträge: 167
Re: ACL manipulieren
« Antwort #6 am: 21.06.06 - 20:19:24 »
hallo helge,
nur mal so aus systemsicht: eine acl lässt sich nicht beliebig aufblähen. bei ca. 950 einträgen ist sense. ich hoffe, dass du das berücksichtigt hast...

grüsse!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: ACL manipulieren
« Antwort #7 am: 21.06.06 - 22:10:25 »
Dem Knoedel stimme ich hier vollkommen zu, ich wagte das aber bisher nicht zu thematisieren: Der Berechtigungsansatz ist meines Erachtens nach hinterfragungswürdig. Zu Euren Plänen solltest Du Dich ggf. detaillierter äussern, denn bestimmt gibt es hier auch einen vollkommen anderen Ansatz.
Die Lösung Deines aktuellen Problems sollten wir aber ggf. noch abwarten, da dieses aus anderer Sicht für andere Forums-Mitglieder mal von Interesse sein könnte.

Bernhard

Offline Helge Jantzen

  • Frischling
  • *
  • Beiträge: 25
  • Geschlecht: Männlich
Re: ACL manipulieren
« Antwort #8 am: 22.06.06 - 12:38:52 »
Hallo,

erstmal danke für die zahlreichen Antworten.

@koehlerbv: Der Agent wird mit Agent.RunOnServer gestartet und ich hatte ihn auf "Aus der Liste der Agenten". Ich hab das jetzt umgestellt auf "periodisch - nie". Die anderen Änderunge hab ich auch eingearbeitet und die ganze Sache läuft perfekt. Hier nochmal der Code des Agenten zur Info:

Sub Initialize
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim ag As Notesagent
   Dim doc As NotesDocument
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   
   Set db = s.CurrentDatabase
   Set ag = s.CurrentAgent
   Set doc = db.GetDocumentByID(ag.ParameterDocID)
   Set acl = db.ACL
   Set entry = acl.GetEntry( doc.GetItemValue("Pruefer_Name")(0))
   
   If (entry Is Nothing) Then
      Call db.GrantAccess( doc.GetItemValue("Pruefer_Name") (0),  ACLLEVEL_EDITOR)
      Set entry = acl.GetEntry( doc.GetItemValue("Pruefer_Name")(0))
   End If
   Call entry.DisableRole("QMB")
   Call entry.DisableRole("QUM-Koordinator")
   Call entry.DisableRole("QM-Bearbeiter")
   If Not (entry Is Nothing) Then
      entry.UserType = ACLTYPE_PERSON
      Call entry.EnableRole( doc.GetItemValue("Pruefer_Typ")(0))
      If (doc.GetItemValue("Pruefer_Typ")(0) = "QMB") Or (entry.Level = ACLLEVEL_MANAGER) Then
         entry.CanDeleteDocuments = True
      Else
         entry.CanDeleteDocuments = False
      End If
      Call acl.Save()
   End If
End Sub

@knoedel0815: Es werden ca. 20 - 25 Einträge, von daher sollte das doch eigentlich kein Problem geben.

Die ganze Berechtigungsgeschichte ist natürlich zu hinterfragen und ist sicher nur ein Ansatz von vielen. Auch hab ich hier das Problem, "Was tun wen ich einen Eintrag löschen will?".  Wobei ich das auch bei den anderen Ansätzen sehe, es sei denn ich baue die Zugriffslisten im Adressbuch periodisch wieder auf oder der entsprechende Agent wird PostDocumentDelete gestartet. Damit wiederum hab ich so gar keine Erfahrung und vor keinen Ansatz wie ich an die Dokumente komme. Bestimmt über ne DocumentCollection, oder? Wie auch immer, wenn ich die Listen neu aufbaue kann ich das genauso gut mit der ACL machen. Mein Ansatz da ist im Moment, dass ich die ACL durchgehe, schaue ob ein entsprechendes Dokument vorhanden ist (oder es eine Servergruppe ist) und den Eintrag gegebenen Falls lösche. Ich kann auch erstmal alle Einträge der ACL (bis auf die Server) löschen und dann die Ansicht durchgehen und entsprechend neue Einträge anlegen.
Soweit meine Überlegungen zu dem Thema. Ich denke beide Ansätze (ACL und Adressbuchlisten) unterscheiden sich im Aufwand kaum voneinander. Bei der ACL-Geschichte muß ich nur die eine DB anpacken, aber diesen Vorteil, wenn es denn überhaupt einer ist, kann man wohl vernachlässigen. Ich muß auchzugeben, dass mich das Ganze irgendwie reitzt und ich das einfach mal gemacht haben möchte.
Ok, ich gespannt auf eure Kommentare.

Gruß,
Helge

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz