From 848cd2233ebde8138607348565529b906dfad1db Mon Sep 17 00:00:00 2001 From: Paolo Date: Mon, 6 Jul 2026 17:59:20 +0200 Subject: [PATCH] Roles in roles permissions: - Changed include/benutzerberechtigung.class.php - Changed DB structure --- include/benutzerberechtigung.class.php | 26 ++- system/dbupdate_3.4.php | 3 +- ...2_Berechtigungssystem_Rollen_in_Rollen.php | 198 ++++++++++++++++++ 3 files changed, 218 insertions(+), 9 deletions(-) create mode 100644 system/dbupdate_3.4/63132_Berechtigungssystem_Rollen_in_Rollen.php diff --git a/include/benutzerberechtigung.class.php b/include/benutzerberechtigung.class.php index 4685f4bbb..6ec5f8059 100644 --- a/include/benutzerberechtigung.class.php +++ b/include/benutzerberechtigung.class.php @@ -410,13 +410,16 @@ EOSQL; UNION Berechtigung ueber Rolle UNION + Berechtigung ueber Rolle in roles + UNION Berechtigung ueber Funktion UNION Berechtigung ueber Funktion Mitarbeiter UNION Berechtigung ueber Funktion Student */ - $qry = "SELECT + $qry = " -- Direkte Berechtigungszuordnung + SELECT benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz, tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, @@ -428,6 +431,7 @@ EOSQL; UNION + -- Berechtigung ueber Rolle SELECT benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz, tbl_benutzerrolle.rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1, @@ -442,20 +446,24 @@ EOSQL; UNION + -- Berechtigung ueber Rollen in Rollen SELECT - benutzerberechtigung_id, tbl_benutzerfunktion.uid, tbl_benutzerrolle.funktion_kurzbz, - tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, - tbl_benutzerfunktion.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_rolle_rolle.basic_rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1, + tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung FROM - system.tbl_benutzerrolle JOIN public.tbl_benutzerfunktion USING(funktion_kurzbz) - WHERE tbl_benutzerfunktion.uid=".$this->db_add_param($uid)." - AND (tbl_benutzerfunktion.datum_von IS NULL OR tbl_benutzerfunktion.datum_von<=now()) - AND (tbl_benutzerfunktion.datum_bis IS NULL OR tbl_benutzerfunktion.datum_bis>=now()) + system.tbl_benutzerrolle + JOIN system.tbl_rolle USING(rolle_kurzbz) + JOIN system.tbl_rolle_rolle ON system.tbl_rolle_rolle.main_rolle_kurzbz = system.tbl_rolle.rolle_kurzbz + JOIN system.tbl_rolleberechtigung ON system.tbl_rolleberechtigung.rolle_kurzbz = system.tbl_rolle_rolle.basic_rolle_kurzbz + JOIN system.tbl_berechtigung ON(tbl_rolleberechtigung.berechtigung_kurzbz=tbl_berechtigung.berechtigung_kurzbz) + WHERE uid=".$this->db_add_param($uid)." UNION + -- Berechtigung ueber Funktion SELECT benutzerberechtigung_id, tbl_benutzerfunktion.uid, tbl_benutzerrolle.funktion_kurzbz, tbl_benutzerrolle.rolle_kurzbz, tbl_rolleberechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1, @@ -472,6 +480,7 @@ EOSQL; UNION + -- Berechtigung ueber Funktion Mitarbeiter SELECT benutzerberechtigung_id, '', tbl_benutzerrolle.funktion_kurzbz, tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, @@ -486,6 +495,7 @@ EOSQL; UNION + -- Berechtigung ueber Funktion Student SELECT benutzerberechtigung_id, '', tbl_benutzerrolle.funktion_kurzbz, tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index d43f1f3d3..e8a9d3ed4 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -95,6 +95,7 @@ require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php'); require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php'); require_once('dbupdate_3.4/70376_lohnguide.php'); require_once('dbupdate_3.4/75888_reihungstest_mehrfachdurchfuehrung.php'); +require_once('dbupdate_3.4/63132_Berechtigungssystem_Rollen_in_Rollen.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -436,7 +437,7 @@ $tabellen=array( "system.tbl_jobtypes" => array("type", "description"), "system.tbl_phrase" => array("phrase_id","app","phrase","insertamum","insertvon","category"), "system.tbl_phrasentext" => array("phrasentext_id","phrase_id","sprache","orgeinheit_kurzbz","orgform_kurzbz","text","description","insertamum","insertvon"), - "system.tbl_rolle" => array("rolle_kurzbz","beschreibung"), + "system.tbl_rolle" => array("rolle_kurzbz","beschreibung","lange_beschreibung"), "system.tbl_rolleberechtigung" => array("berechtigung_kurzbz","rolle_kurzbz","art","anmerkung","insertamum","insertvon"), "system.tbl_verarbeitungstaetigkeit" => array("taetigkeit_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig","aktiv"), "system.tbl_webservicelog" => array("webservicelog_id","webservicetyp_kurzbz","request_id","beschreibung","request_data","execute_time","execute_user"), diff --git a/system/dbupdate_3.4/63132_Berechtigungssystem_Rollen_in_Rollen.php b/system/dbupdate_3.4/63132_Berechtigungssystem_Rollen_in_Rollen.php new file mode 100644 index 000000000..e6a046060 --- /dev/null +++ b/system/dbupdate_3.4/63132_Berechtigungssystem_Rollen_in_Rollen.php @@ -0,0 +1,198 @@ +db_query('SELECT "lange_beschreibung" FROM "system"."tbl_rolle" LIMIT 1')) +{ + $qry = 'ALTER TABLE "system"."tbl_rolle" ADD "lange_beschreibung" TEXT NULL;'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle: '.$db->db_last_error().'
'; + else + echo '
Added column lange_beschreibung to table system.tbl_rolle'; +} + +// Creates table system.tbl_rolle_rolle if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_rolle_rolle LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_rolle_rolle ( + main_rolle_kurzbz VARCHAR(32) NOT NULL, + basic_rolle_kurzbz VARCHAR(32) NOT NULL, + insertamum TIMESTAMP NOT NULL DEFAULT NOW() , + insertvon VARCHAR(32) NOT NULL + );'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
system.tbl_rolle_rolle table created'; + + $qry = 'COMMENT ON TABLE system.tbl_rolle_rolle IS \'Table to save the connections between permission roles.\'; + COMMENT ON COLUMN system.tbl_rolle_rolle.main_rolle_kurzbz IS \'Main role\'; + COMMENT ON COLUMN system.tbl_rolle_rolle.basic_rolle_kurzbz IS \'Basic role\'; + COMMENT ON COLUMN system.tbl_rolle_rolle.insertamum IS \'Insert date\'; + COMMENT ON COLUMN system.tbl_rolle_rolle.insertvon IS \'Insert by\';'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
system.tbl_rolle_rolle table commented'; + + $qry = 'ALTER TABLE system.tbl_rolle_rolle ADD CONSTRAINT pk_tbl_rolle_rolle PRIMARY KEY (main_rolle_kurzbz, basic_rolle_kurzbz);'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
system.tbl_rolle_rolle primary key pk_tbl_rolle_rolle added'; + + $qry = 'ALTER TABLE system.tbl_rolle_rolle + ADD CONSTRAINT fk_tbl_rolle_rolle_main_tbl_rolle + FOREIGN KEY (main_rolle_kurzbz) + REFERENCES system.tbl_rolle (rolle_kurzbz) + ON DELETE RESTRICT ON UPDATE CASCADE;'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
system.tbl_rolle_rolle foreign key fk_tbl_rolle_rolle_main_tbl_rolle added'; + + $qry = 'ALTER TABLE system.tbl_rolle_rolle + ADD CONSTRAINT fk_tbl_rolle_rolle_basic_tbl_rolle + FOREIGN KEY (basic_rolle_kurzbz) + REFERENCES system.tbl_rolle (rolle_kurzbz) + ON DELETE RESTRICT ON UPDATE CASCADE;'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
system.tbl_rolle_rolle foreign key fk_tbl_rolle_rolle_basic_tbl_rolle added'; + + $qry = 'GRANT SELECT ON TABLE system.tbl_rolle_rolle TO web;'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to web on system.tbl_rolle_rolle'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_rolle_rolle TO vilesci;'; + if (!$db->db_query($qry)) + echo 'system.tbl_rolle_rolle: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to vilesci on system.tbl_rolle_rolle'; +} + +// Get the view definition for the vw_berechtigung_nichtrekursiv view +if ($result = $db->db_query("SELECT view_definition FROM information_schema.views WHERE table_schema='system' AND table_name='vw_berechtigung_nichtrekursiv'")) +{ + // If exists (at this point should!) + if ($row = $db->db_fetch_object($result)) + { + // If the definition does _not_ contain the system.tbl_rolle_rolle table + if (!mb_stristr($row->view_definition, 'system.tbl_rolle_rolle')) + { + $qry = " + CREATE OR REPLACE VIEW system.vw_berechtigung_nichtrekursiv AS + SELECT + uid, berechtigung_kurzbz, + -- art zusammenfassung und nur die nehmen die gleich sind + CASE WHEN length(art)>length(art1) THEN art1 ELSE art END as art, + oe_kurzbz, kostenstelle_id + FROM + ( + -- Normal + SELECT + benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, + tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, + tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung + FROM + system.tbl_benutzerrolle JOIN system.tbl_berechtigung USING(berechtigung_kurzbz) + + -- Rollen + UNION + SELECT + benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_benutzerrolle.rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1, + tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, + tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung + FROM + system.tbl_benutzerrolle JOIN system.tbl_rolle USING(rolle_kurzbz) + JOIN system.tbl_rolleberechtigung USING(rolle_kurzbz) + JOIN system.tbl_berechtigung ON(tbl_rolleberechtigung.berechtigung_kurzbz=tbl_berechtigung.berechtigung_kurzbz) + + -- Rollen in Rollen + UNION + SELECT + benutzerberechtigung_id, tbl_benutzerrolle.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_benutzerrolle.rolle_kurzbz, tbl_berechtigung.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_rolleberechtigung.art art1, + tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, + tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung + FROM + system.tbl_benutzerrolle + JOIN system.tbl_rolle USING(rolle_kurzbz) + JOIN system.tbl_rolle_rolle ON system.tbl_rolle_rolle.main_rolle_kurzbz = system.tbl_rolle.rolle_kurzbz + JOIN system.tbl_rolleberechtigung ON system.tbl_rolleberechtigung.rolle_kurzbz = system.tbl_rolle_rolle.basic_rolle_kurzbz + JOIN system.tbl_berechtigung ON(tbl_rolleberechtigung.berechtigung_kurzbz=tbl_berechtigung.berechtigung_kurzbz) + + -- Funktionen + UNION + SELECT + benutzerberechtigung_id, tbl_benutzerfunktion.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, + tbl_benutzerfunktion.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, + tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung + FROM + system.tbl_benutzerrolle JOIN public.tbl_benutzerfunktion USING(funktion_kurzbz) + WHERE + (tbl_benutzerfunktion.datum_von IS NULL OR tbl_benutzerfunktion.datum_von<=now()) + AND (tbl_benutzerfunktion.datum_bis IS NULL OR tbl_benutzerfunktion.datum_bis>=now()) + + -- Funktion Mitarbeiter + UNION + SELECT + benutzerberechtigung_id, vw_mitarbeiter.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, + tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, + tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung + FROM + system.tbl_benutzerrolle, campus.vw_mitarbeiter + WHERE + tbl_benutzerrolle.funktion_kurzbz='Mitarbeiter' and vw_mitarbeiter.aktiv + + + -- Funktion Student + UNION + SELECT + benutzerberechtigung_id, vw_student.uid, tbl_benutzerrolle.funktion_kurzbz, + tbl_benutzerrolle.rolle_kurzbz, tbl_benutzerrolle.berechtigung_kurzbz, tbl_benutzerrolle.art, tbl_benutzerrolle.art art1, + tbl_benutzerrolle.oe_kurzbz, tbl_benutzerrolle.studiensemester_kurzbz, tbl_benutzerrolle.start, + tbl_benutzerrolle.ende, tbl_benutzerrolle.negativ, tbl_benutzerrolle.updateamum, tbl_benutzerrolle.updatevon, + tbl_benutzerrolle.insertamum, tbl_benutzerrolle.insertvon,tbl_benutzerrolle.kostenstelle_id,tbl_benutzerrolle.anmerkung + FROM + system.tbl_benutzerrolle, campus.vw_student + WHERE + tbl_benutzerrolle.funktion_kurzbz='Student' and vw_student.aktiv + ) as a + JOIN public.tbl_benutzer USING(uid) + WHERE + -- Datumsgrenzen beruecksichtigen + tbl_benutzer.aktiv = true + AND (a.start<=now() OR a.start is null) + AND (a.ende>=now() OR a.ende is null) + + -- Neagtiv Rechte entfernen + AND not negativ + AND NOT EXISTS(SELECT + 1 + FROM + system.tbl_benutzerrolle JOIN system.tbl_berechtigung USING(berechtigung_kurzbz) WHERE uid=a.uid AND berechtigung_kurzbz=a.berechtigung_kurzbz AND negativ); + + GRANT SELECT ON system.vw_berechtigung_nichtrekursiv TO web; + GRANT SELECT ON system.vw_berechtigung_nichtrekursiv TO vilesci; + "; + + if(!$db->db_query($qry)) + echo 'system.vw_berechtigung_nichtrekursiv:'.$db->db_last_error().'
'; + else + echo '
system.vw_berechtigung_nichtrekursiv angepasst damit nur aktive Benutzer beruecksichtigt werden'; + } + } +} +