Versteckte User-Exits: Zugriffsberechtigungen manipulieren (GACL)
Die Mappentypen "Invoice", "Procurement" und "Mailroom" verwenden den Mappenklassenschutz und im Standard ist hier das Text-Feld "Rights" hinterlegt. Der Mappenklassenschutz berücksichtigt Zugriffsprofile und Benutzer-Logins. Standardmäßig setzen sich die Berechtigungen aus den Feldern "RightsInitial" und "RightsWorkflow" zusammen. Die Berechtigungen werden bei einer Weiterleitung automatisch erweitert. Jede Gruppe bzw. jeder Benutzer welcher am Workflow teilnimmt erhält automatisch Zugriffsrechte.
Im Feld "RightsInitial" werden die initialen Berechtigungen festgehalten, welche über die entsprechende WEB-Konfiguration gesetzt werden können. Diese Rechte werden bei einer weiterleitung neu ermittelt! Wenn initiale Berechtigungen abhängig von Feldwerten definiert wurden (zum Beispiel vom Mandanten-Feld) und sich der Feldwert in einer Mappe ändert, dann können neue Zugriffsberechtigungen hinzukommen und es kann auch vorkommen, dass Zugriffsberechtigungen wieder entzogen werden!
Das Feld "RightsWorkflow" speichert hingegen die Gruppen und Benutzer, die am Workflow zum Vorgang teilgenommen haben. Diese Liste wird immer weiter fortgeführt.
Die Zugriffsberechtigungen werden technisch über das Skript-Objekt "RightsGACL" gesteuert. Dieses Objekt wird mit dem DocFile-Objekt als Parameter aufgerufen und enthält folgende Methoden:
- addWorkflowEntry(String login/tech ap name)
- addAccessProfile(AccessProfile)
- addSystemUser(SystemUser, Boolean add agent in case of absence)
- checkRights(SystemUser)
- createGACLString()
- readInitialRights()
- readRightsFromField(String fieldName)
Das Objekt hat folgende Eigenschaften:
Eigenschaft | Typ | Beschreibung |
Error | String | Fehlermeldung |
Result | Boolean | Ergebnis |
DocFile | DocFile-Objekt | Aktuelle Mappe |
DocFileID | DocFile-ID | Aktuelle Mappen-ID |
Log | String | Logging-Informationen |
RightsInitial | Objekt | Objekt mit den initialen Berechtigungen |
RightsInitialStr | String | GACL-String mit den initialen Berechtigungen |
RightsWF | Objekt | Objekt mit den Workflow-Berechtigungen |
RightsWFStr | String | GACL-String mit den Workflow-Berechtigungen |
Die Methode "createGACLString()" liefert den fertigen GACL-String (ohne diesen direkt in das Feld "Rights" zu schreiben). Ab Invoice V.1.1.200 enthält diese Funktion 2 optionale UserExit-Funktionen, um das GACL-Ergebnis zu manipulieren. Die Funktionen können bei Bedarf in eine UserExit-Bibliothek hinzugefügt werden.
/** Die Funktion wird nach dem Erstellen des GACL-Strings ausgeführt.
**/
RightsGACL.prototype.ue_BeforeCreateGACLString = function(){
;
}
/** Die Funktion wird nach dem Erstellen des GACL-Strings ausgeführt.
* In dem Beispiel wird ein zusätzliches Feld 'AdditionalRights' mit zusätzlichen Zugriffsberechtigungen ausgewertet.
**/
RightsGACL.prototype.ue_AfterCreateGACLString = function(){
if( this.DocFile.hasField("AdditionalRights") ){
this.Log += "[INFO]["+this.DocFileID+"] has field 'AdditionalRights'" + this.LineBreak;
var userObj = {};
var gaclArr = this.GACL.split("\r\n");
for( var i=0; i<gaclArr.length; i++ ){
var su = context.findSystemUser(gaclArr[i]);
if( su instanceof SystemUser ){
userObj[su.login] = su.login;
}
}
var userArr = this.DocFile.AdditionalRights.split("\r\n");
for( var j=0; j<userArr.length; j++ ){
var su2 = context.findSystemUser(userArr[j]);
if( su2 instanceof SystemUser ){
if( userObj[su2.login] ){
this.Log += "[INFO]["+this.DocFileID+"]["+j+"] system user("+su2.login+") already has rights" + this.LineBreak;
}
else{
this.Log += "[INFO]["+this.DocFileID+"]["+j+"] system user("+su2.login+") add GACL rights" + this.LineBreak;
this.GACL += su2.login+"\r\n";
}
}
}
}
//util.out(this.Log);
}
No Comments