[inhalt]
Projekt BISO 3 - Handbuch

Lesezugriff auf Records im Backend prüfen

Datensätze, auf welche der User gar keinen Lesezugriff hat, sollen auch nie ausgeliefert werden. Um dies sicherzustellen, müssen einige Dinge beachtet werden:

Holen von Datenstätzen via BisoEntity::getObjectSet()

Werden Daten via BisoEntity::getObjectSet() (und vererbten Entities) geholt, werden die BISO-Berechtigungen (user_id,group_id,group_mod,world_mod) automatisch geprüft.

Einzig zu beachten ist ein allfällig gesetzter Parameter nur_1_regstelle, siehe unten.

Zugriffs-Filter: AccessChecker::getReadPermissionCheckSql()

Muss ein eigenes Query erstellt werden, kann das Permission-SQL für eine Tabelle separat geholt werden:

Beispiel: Holen aller Personen-Datensätze, aber berechtigungsgeprüft:

    $query = "SELECT * FROM person WHERE ".AccessChecker::getReadPermissionCheckSql($user,'person');

resultiert im Query:

    SELECT * FROM person WHERE (
        (person.user_id = 3)
        OR (person.user_id IS NULL)
        OR (person.world_mod = 6)
        OR (person.world_mod = 4)
        OR (
            person.group_id IN (SELECT gruppe_id FROM benutzer_gruppe WHERE benutzer_id = 3)
            AND (person.group_mod = 4 OR person.group_mod = 6)
        )
    )

Zugriffs-Filter: AccessChecker::getOnlyOneRegstelleSql()

Ist der Parameter nur_1_regstelle gesetzt, dürfen bei diversen Tabellen nur diejenigen Datensätze geliefert werden, welche der aktuellen Regionalstelle des Benutzers gehören.

Leider heisst das Regionalstellen-Feld bei vielen betroffenen Tabellen nicht gleich.

Um die Abfrage zu vereinfachen, stellt AccessChecker folgende Funktion zur Verfügung:

AccessChecker::getOnlyOneRegstelleSql($user,$filter_col = 'institution_id');

Für eine Abfrage der Tabelle 'beratungsfall' würde die Funktion in etwa folgendes liefern:

$ret = AccessChecker::getOnlyOneRegstelleSql($user,'institution_id');
/**
$ret = (institution_id = 3); // 3 entspricht der Regionalstellen-ID vom User
*/

Beachte: Die Funktion getOnlyOneRegstelleSql() checkt selber, ob eine Filterung nötig ist, ob also der User ev. ein Admin ist, oder ob der Parameter nur_1_regstelle gesetzt ist oder nicht! Die Funktion kann also ohne spezielle Checks auf den entsprechenden Abfragen angehängt werden!

Holen von Daten mit freiem Query: KPController::getResultSet()

Wird ein komplett freies Query anhand einer View / Tabelle / SQL benötigt, kann die Funktion KPController::getResultSet() verwendet werden. Diese hängt auf Wunsch sowohl das Read-Permission-SQL als auch das Regstellen-Sql an:

// in Kind von KPController:
$res = $this->getResultSet($user,'v_eigene_view',"name LIKE 'hans%'",'name',50,1,true,'institution_id');

Dieses Query holt 50 Datensätze von Page 1 aus der View v_eigene_view, gefiltert und sortiert, beachtet die Read-Permissions und beachtet die nur_1_regstelle-Regel anhand der Spalte institution_id.