Hallo zusammen,
ich erlaube mir mal im Fortgeschrittenen-Forum zu Posten.
Ich bin gerade dabei eine Benutzerverwaltung für mein Projekt zu erstellen, hierbei möchte ich schön/einfach die Berechtigungen der User verwalten können.
Das Berechtigungssystem ist relativ simpel aufgebaut, ich schreibe nach erfolgreichem Login einen Array in die Session auf diese kann jederzeit über eine Methode zugegriffen werden.
Der Array mit den Berechtigungen sieht z.B. so aus: (Die Keys der SubArrays repräsentieren den Seitenname und die Werte die Rechte)
Nun gut jetzt zum eigentlichen Problem.
Ich lasse mir nun in der Benutzerverwaltung für alle Verfügbaren Rechte eine Checkbox erstellen, falls der User das Recht hat wird mit dem Attribute checked selektiert.
Wenn ich jetzt das geänderte Formular abschicke möchte ich ungern alle Berechtigungen des Users löschen und neu schreiben, es sollen also die Unterschiede ermittelt werden und nur die betroffenen Einträge in der Zuordungstabelle gelöscht/hinzugefügt werden.
Hier meine Lösung:
Ich würde gerne eure Meinungen dazu hören könnte mir vorstellen das es bessere Wege gibt das zu lösen..
Mir freundlichen Grüßen
Bodo
ich erlaube mir mal im Fortgeschrittenen-Forum zu Posten.
Ich bin gerade dabei eine Benutzerverwaltung für mein Projekt zu erstellen, hierbei möchte ich schön/einfach die Berechtigungen der User verwalten können.
Das Berechtigungssystem ist relativ simpel aufgebaut, ich schreibe nach erfolgreichem Login einen Array in die Session auf diese kann jederzeit über eine Methode zugegriffen werden.
Der Array mit den Berechtigungen sieht z.B. so aus: (Die Keys der SubArrays repräsentieren den Seitenname und die Werte die Rechte)
PHP-Code:
array (size=2)
'termine' =>
array (size=3)
0 => string 'eintragen' (length=9)
1 => string 'bearbeiten' (length=10)
2 => string 'loeschen' (length=8)
'news' =>
array (size=3)
0 => string 'eintragen' (length=9)
1 => string 'bearbeiten' (length=10)
2 => string 'loeschen' (length=8)
Ich lasse mir nun in der Benutzerverwaltung für alle Verfügbaren Rechte eine Checkbox erstellen, falls der User das Recht hat wird mit dem Attribute checked selektiert.
Wenn ich jetzt das geänderte Formular abschicke möchte ich ungern alle Berechtigungen des Users löschen und neu schreiben, es sollen also die Unterschiede ermittelt werden und nur die betroffenen Einträge in der Zuordungstabelle gelöscht/hinzugefügt werden.
Hier meine Lösung:
PHP-Code:
public function updateUser($user_id) {
$sql = 'UPDATE benutzer SET vorname = :vorname, name = :name, email = :email WHERE id = :id';
$stmt = $this->dbconn->prepare($sql);
$stmt->execute(array(':vorname' => $_POST['vor-name'], ':name' => $_POST['nach-name'], ':email' => $_POST['email'], ':id' => $user_id));
// Update Rechte
$sql = 'SELECT id, seite FROM benutzer_seiten';
$stmt = $this->dbconn->prepare($sql);
$stmt->execute();
$seiten = $stmt->fetchAll(PDO::FETCH_ASSOC);
$userRechte = array();
$stmt = $this->dbconn->prepare('SELECT benutzer_rechte.recht FROM benutzer_zuweisung_seiten_rechte LEFT JOIN benutzer_rechte ON benutzer_rechte.id=benutzer_zuweisung_seiten_rechte.recht_id WHERE benutzer_id = :user_id AND seite_id = :seite');
foreach ($seiten as $seite) {
$stmt->execute(array(':user_id' => $user_id, ':seite' => $seite['id']));
$userRechte[$seite['seite']] = $stmt->fetchAll(PDO::FETCH_COLUMN);
}
var_dump($userRechte);
var_dump($_POST['rechte']);
$stmtInsert = $this->dbconn->prepare('INSERT INTO benutzer_zuweisung_seiten_rechte (benutzer_id, seite_id, recht_id) VALUES (:benutzer, (SELECT id FROM benutzer_seiten WHERE seite = :seite), (SELECT id FROM benutzer_rechte WHERE recht = :recht)');
$stmtDelete = $this->dbconn->prepare('DELETE FROM benutzer_zuweisung_seiten_rechte WHERE benutzer_id = :benutzer AND seite_id = (SELECT id FROM benutzer_seiten WHERE seite = :seite) AND recht_id = (SELECT id FROM benutzer_rechte WHERE recht = :recht)');
foreach ($userRechte as $seite => $rechte) {
if (array_key_exists($seite, $_POST['rechte'])) {
foreach (array_diff($_POST['rechte'][$seite], $rechte) as $recht) {
echo 'Insert ' . $seite . ' ' . $recht . '<br>';
//$stmtInsert->execute(array(':benutzer' => $user_id, ':seite' => $seite, ':recht' => $recht));
}
foreach (array_diff($rechte, $_POST['rechte'][$seite]) as $recht) {
echo 'Delete ' . $seite . ' ' . $recht . '<br>';
//$stmtDelete->execute(array(':benutzer' => $user_id, ':seite' => $seite, ':recht' => $recht));
}
} else {
foreach ($rechte as $recht) {
echo 'Delete ' . $seite . ' ' . $recht . '<br>';
//$stmtDelete->execute(array(':benutzer' => $user_id, ':seite' => $seite, ':recht' => $recht));
}
}
}
}
Mir freundlichen Grüßen
Bodo
Kommentar