Datensätze, auf welche der User gar keinen Lesezugriff hat, sollen auch nie ausgeliefert werden. Um dies sicherzustellen, müssen einige Dinge beachtet werden:
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.
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)
)
)
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!
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.