Prozedur zum Anlegen, Bearbeiten und Löschen von Zugriffsbeschränkungen auf Personen-Merkmale für (Datenbank-)Benutzer.
Zum Verständnis - die Logik einer Zugriffsbeschränkung eines Benutzers für ein Merkmal ist diese :
1.) Eine direkt zu einem Benutzer („UserID“) gespeicherte Konfiguration hat Vorrang vor anderen Einstellungen zum selben Merkmal (z.B. zu einer Gruppe, der der Benutzer angehört).
Besonderheit : Es kann auch explizit „AccessRestriction = 0“ konfiguriert sein, was „keine Beschränkung“ bedeutet - sinnvoll wenn für einen Benutzer eine AUSNAHME (weil z.B. „global“, siehe Punkt 3, eine Beschränkung konfiguriert ist) gelten soll.
2.) Falls für ein Merkmal zu einem Benutzer („UserID“) nichts konfiguriert ist, gelten die evtl. vorhandenen Konfigurationen zu Gruppen („UserGroupID“s), denen der Benutzer zugeordnet ist. Da ja eine Zuordnung zu MEHREREN Gruppen vorhanden sein kann und somit für ein Merkmal MEHRERE Konfigurationen in Frage kommen können, wird nach folgender Regel verfahren :
PRO Merkmal gelten die Zugriffsbeschränkungen der Gruppe, denen der Benutzer mit der kleinsten „SortNo“ (bedeutet „höchste Priorität“) zugeordnet ist.
Besonderheit auch hier (wie schon bei Punkt 1) : Es kann „AccessRestriction = 0“ konfiguriert sein, was „keine Beschränkung“ bedeutet.
3.) Nur wenn weder zum Benutzer („UserID“) noch zu einer der Gruppen („UserGroupID“s), denen der Benutzer zugeordnet ist, eine Konfiguration zu einem Merkmal heranzuziehen ist, greift eine evtl. zur speziellen „UserID = -1“ (also „global“) gespeicherte Einstellung.
Wie schon bei den ersten beiden Punkten kann eine „AccessRestriction = 0“-Einstellung herauskommen, was „keine Beschränkung“ bedeutet (weil man z.B. „global keine Beschränkung, aber Einschränkungen für bestimmte Benutzer“ realisieren möchte).
Hinweis :
Es gibt bestimmte Einstellungen, die verhindern, dass eine Zugriffsbeschränkung eingerichtet werden kann, wenn das entsprechende Merkmal zu mindestens einer dieser Einstellungen konfiguriert ist :
Wenn „PersonCharacteristicID“ zur Einstellung konfiguriert ist, darf keine Einschränkung des lesenden Zugriffs vorgenommen werden
Wenn „PersonCharacteristicID“ zur Einstellung konfiguriert ist, darf keine Einschränkung des lesenden Zugriffs vorgenommen werden
Wenn „PersonCharacteristicID“ zur Einstellung konfiguriert ist, darf weder das Bearbeiten noch das Löschen oder die Neuanlage eingeschränkt werden
Wenn „PersonCharacteristicID“ zur Einstellung konfiguriert ist, darf keine Einschränkung des lesenden Zugriffs vorgenommen werden.
Anmerkungen zum Parameter „AccessRestriction“ und „ReadAccessRestrictionPattern“ :
1. Der anzugebende Wert in „AccessRestriction“ sind die Beschränkungen als Summe (also „bitmap“) folgender Werte :
2. Es kann auch der Wert „0“ für „AccessRestriction“ übergeben werden, um explizit „KEINE Zugriffsbeschränkung“ zu definieren - sinnvoll wenn eine AUSNAHME konfiguriert werden soll (weil z.B. „global“ eine Beschränkung definiert ist).
3. In „ReadAccessRestrictionPattern“ ist immer „NULL“ anzugeben, wenn KEIN Lese-Verbot bzw. KEINE Lese-Beschränkung angegeben wurde (wenn also „AccessRestriction & 8 = 0“ ist, sprich der Summand „8“ NICHT in der „AccessRestriction“-Summe vorkommt) ! Andernfalls KANN hier ein „pattern“ stehen, das angibt, welcher Teil von Eigenschaften zurückgegeben wird, also die Art der Beschränkung definiert. „NULL“ bedeutet bei gegebenem Lese-Verbot, daß Datensätze zur Eigenschaft komplett fehlen - für Details gilt dies im Falle eines Leseverbots („AccessRestriction & 8 = 8“) IMMER, sprich „ReadAccessRestrictionPattern“ hat KEINE Bedeutung für Details ! Derzeit sind folgend „pattern“ möglich :
Hinweis : n = 0 ist möglich, was dazu führt, daß anstelle der Eigenschaft „NULL“ ausgegeben wird (egal ob die „ERSTEN 0 Zeichen“ oder die „LETZTEN 0 Zeichen“ definiert ist). Im Gegensatz zum kompletten Lese-Verbot (wenn also „NULL“ im „ReadAccessRestrictionPattern“ steht) kann der Aufrufer so wenigstens erkennen, ob die betreffende Person eine Eigenschaft hat oder nicht (beim kompletten Lese-Verbot fehlt der Datensatz ja gänzlich) !
Beispiele zu „AccessRestriction“ und „ReadAccessRestrictionPattern“ :
1. Soll der Benutzer „UserID“ zum Merkmal „PersonCharacteristicID“ keine neuen Eigenschaften/Details anlegen und keine bestehenden Eigenschaften bzw. Details löschen können, aber uneingeschränkten lesenden Zugriff erhalten und bereits bestehende Eigenschaften bzw. Details zum Merkmal ändern dürfen, übergibt man für „AccessRestriction“ den Wert „5“, sprich die Summe der Werte „1“ (Neu-Anlage verboten) und „4“ (Löschen verboten). „ReadAccessRestrictionPattern“ ist bedeutungslos, daher also „NULL“.
2. Soll der Benutzer „UserID“ eine Eigenschaft zum Merkmal „PersonCharacteristicID“ zwar anlegen und ändern dürfen, möchte man ihm aber zum einen verwehren, Eigenschaften dazu zu löschen und zum anderen Datenätze zum Merkmal überhaupt zu sehen, übergibt man den Wert „12 für „AccessRestriction“ - was der Summe aus „4“ (Löschen verboten) und „8“ (Lesen verboten oder eingeschränkt) entspricht. Da der lesende Zugriff komplett verboten sein soll, ist in „ReadAccessRestrictionPattern“ nichts (also „NULL“) anzugeben.
Anmerkung : Realistischer Anwendungsfall für so ein Szenario ist z.B. ein „internes Merkmal“ der Art „Bonitätsindex“, das für den „publicuser“ („UserID = 0“) beschränkt werden soll. Dieses wird auf der Webseite - auf der in aller Regel die Prozedur-Aufrufe durch den Benutzer „publicuser“ erfolgen - zwar gesetzt (aufgrund von webservice-Calls auf entsprechende Dienstleister z.B.), das soll aber dem Kunden auf der Webseite verborgen bleiben und nicht etwa aufgrund eines Programmierfehlers (durch den allein schon zu erkennen ist, daß es das Merkmal überhaupt gibt) doch sichtbar sein (und gelöscht werden soll die Eigenschaft auch nicht aus Versehen).
HTTP-Method | POST |
HTTP-Auth | Optional |
Alias | pm_ModifyPersonCharacteristicAccessRestrictionsForUsers_Ad |
Tags | |
Engine-Kategorie | person management |
Engine-Typ | Daten-Änderung |
Letzte Aktualisierung | 7.0.7 (2015-01-29) |
Name 1) | Standard-Wert | Beschreibung 2) | SQL-Datentyp3) | ab Version |
---|---|---|---|---|
UserID | ID eines „dStore“-Benutzers, der in „UserInfo“ registriert ist (siehe mi_GetUserInfo_Ad), für den eine Zugriffsbeschränkung angelegt/geändert/gelöscht werden soll | smallint | 6.5.2 | |
PersonCharacteristicID | ID eines Personen-Merkmals für das die Zugriffsbeschränkung gilt. Ist „Delete = 0“ und existiert für „UserID“ noch keine Beschränkung zu diesem Merkmal, wird sie angelegt, ansonsten geändert. | smallint | 6.5.2 | |
AccessRestriction | Zugriffsbeschr. als Summe dieser Werte : - „1“ : Neu-Anlage v. Eigensch./Details verb. - „2“ : Ändern v. Eigensch./Details verb. - „4“ : Löschen v. Eigensch./Details verb. - „8“ : Lesen v. Eigensch. verb./eingeschr. UND Lesen v. Details verb. | tinyint | 6.5.2 | |
ReadAccessRestrictionPattern | NULL | Nur bei les. Beschr. („AccessRestriction & 8 = 8“) relev. Mögl. Werte: - “#left(<n>)#„ : ERSTE n („0“ mögl.) Zeichen d. Eig. zurückgeb. - “#right(<n>)#„ : LETZTE n („0“ mögl.) Zeichen d. Eig. zurückgeb. - NULL : Datensätze zum Merkmal nicht zurückgeb. | varchar(100) | 6.5.2 |
Delete | 0 | „1“ angeben, um die bestehende Beschränkung für „UserID“ zum Merkmal „PersonCharacteristicID“ zu löschen. Ansonsten (bei „0“) wird eine neue Beschränkung angelegt bzw. die vorhandene geändert. | bit | 6.5.2 |
Die Prozedur hat keine Rückgaben.
Die Prozedur hat keine Output-Parameter.
Code | Beschreibung | Quelle 4) |
---|---|---|
-698 | Zugriffsbeschränkung kann nicht geändert werden, da eine Einstellung existiert die dies verhindert | nur direkt |
-570 | Nur der Super-Admin darf diese Prozedur (mit diesen Parametern) ausführen | nur direkt |
-569 | Der Benutzer hat kein Ausführungsrecht für die Prozedur | nur indirekt |
-567 | Die Prozedur darf z. Zt. nicht ausgeführt werden | nur indirekt |
-566 | Die Prozedur darf mit den übergebenen Parametern nicht ausgeführt werden | nur indirekt |
-535 | Das Datum liegt nicht in der Vergangenheit | nur indirekt |
-530 | Der Wert ist nicht konvertierbar | nur indirekt |
-510 | Der Benutzer ist nicht registriert | nur indirekt |
-504 | Es ist ein Problem aufgetreten, das nicht gelöst werden kann, Prozedur wird daher abgebrochen | direkt und indirekt |
-502 | Die Parameter-Werte der Prozedur können nicht verarbeitet werden (kein passendes Trennzeichen) | nur indirekt |
-500 | Falsche Parameter | direkt und indirekt |
Die Rückgabe erfolgt als XML-Dokument welches gegen das Schema Response/EngineProcedure_v1_0.xsd validiert.
7.0.7 | 2015-01-29 | Interne Änderung : Datentyp-Erweiterung des „ReferenceKey“ [für „_mi_StartProcedure“-Aufruf] |
6.5.2 | 2013-02-26 | Erstmalig in dieser Version erstellt |
Der folgende Link öffnet in einem separaten Fenster den Engine Playground der fest mit dem dbap-demo System verbunden ist:
Unformatierte Ausgabe:
curl -X POST 'http://<partner>-<project>.dstore.de/default/engine/pm_ModifyPChAccResForUser_Ad?UserID=<value>&PersonCharacteristicID=<value>&AccessRestriction=<value>'
Mit xmllint 5) formatierte Ausgabe:
curl -X POST 'http://<partner>-<project>.dstore.de/default/engine/pm_ModifyPChAccResForUser_Ad?UserID=<value>&PersonCharacteristicID=<value>&AccessRestriction=<value>' | xmllint --format -
use dStore_php\WebService; $service = new WebService\Service( WebService\Scheme::HTTP,'<partner>-<project>.dstore.de', 80); $request = new WebService\Requests\Engine\Procedure\Request( new WebService\Requests\AccessData('default'), 'pm_ModifyPChAccResForUser_Ad', array( 'UserID' => <value>, 'PersonCharacteristicID' => <value>, 'AccessRestriction' => <value>, // 'ReadAccessRestrictionPattern' => NULL, // 'Delete' => 0 ) ); $service->execute($request); $xml_result = $request->getResponse()->getBody()->toSimpleXmlDocument(); $ResultSet = $xml_result->getRowsAsArray();
XML zur Ausführung mit der Methode engine/execute, z.B. per
curl --header 'Content-Type: application/xml' -X POST 'http://<partner>-<kunde>.dstore.de/default/engine/execute' -d '<xml-daten>'
<?xml version="1.0" encoding="UTF-8"?> <ListOfBatches> <Batch No="0"> <Procedure Name="pm_ModifyPChAccResForUser_Ad"> <Parameters> <Parameter Name="UserID"><!-- smallint value --></Parameter> <Parameter Name="PersonCharacteristicID"><!-- smallint value --></Parameter> <Parameter Name="AccessRestriction"><!-- tinyint value --></Parameter> <!-- <Parameter Name="ReadAccessRestrictionPattern">NULL</Parameter> --> <!-- <Parameter Name="Delete">0</Parameter> --> </Parameters> </Procedure> </Batch> </ListOfBatches>