LU12c - Rechte & Rollen: vergeben, anzeigen, entziehen
Ziel: Mit GRANT Rechte auf passenden Ebenen vergeben, mit SHOW GRANTS prüfen, mit REVOKE entziehen. Wir bilden WordPress-Rollen sinngemäss auf MySQL-Rollen ab:
| WP-Rolle (App) | Sinnbild DB-Rolle (MySQL) | Typische DB-Rechte (Beispiel) |
|---|---|---|
| Administrator | wp_admin | ALL PRIVILEGES auf wttw.* |
| Redakteur (Editor) | wp_editor | SELECT, INSERT, UPDATE, DELETE auf Inhaltstabellen (posts, comments), SELECT auf users |
| Autor | wp_author | SELECT, INSERT, UPDATE auf posts eigener Inhalte (fachlich; DB-seitig vereinfachen wir), SELECT, INSERT auf comments, SELECT auf users |
| Leser/Integration | wp_read | SELECT auf wttw.* |
Hinweis: „Eigene Inhalte“ lässt sich fachlich (App-Logik) sauber lösen; auf reiner DB-Ebene bräuchte es z. B. Row-Level-Security oder Trigger. Für die Übung vereinfachen wir auf Tabellen-Ebene.
0) Ebenen-Überblick
| Ebene | Schreibweise | Wirkung (Beispiel) |
|---|---|---|
| Datenbank | wttw.* | alle Tabellen in wttw |
| Tabelle | wttw.posts | nur diese Tabelle |
| Spalte | users(email) | nur bestimmte Spalte(n) |
1) Rollen anlegen & berechtigen (einmalig als root)
-- Rollen CREATE ROLE IF NOT EXISTS wp_admin, wp_editor, wp_author, wp_read; -- Rechte an Rollen vergeben GRANT ALL PRIVILEGES ON wttw.* TO wp_admin; GRANT SELECT ON wttw.users TO wp_editor, wp_author; GRANT SELECT, INSERT, UPDATE, DELETE ON wttw.posts TO wp_editor; GRANT SELECT, INSERT, UPDATE ON wttw.posts TO wp_author; GRANT SELECT, INSERT, DELETE ON wttw.comments TO wp_editor; GRANT SELECT, INSERT ON wttw.comments TO wp_author; GRANT SELECT ON wttw.* TO wp_read;
2) Rollen Benutzern zuweisen & Standardrollen setzen
-- Benutzer aus Seite 1: -- 'caro_admin'@'localhost', 'martin_admin'@'localhost', 'tran_editor'@'localhost', 'wp_api'@'localhost' GRANT wp_admin TO 'caro_admin'@'localhost', 'martin_admin'@'localhost'; GRANT wp_editor TO 'tran_editor'@'localhost'; GRANT wp_read TO 'wp_api'@'localhost'; -- Standardrollen aktiv bei Login SET DEFAULT ROLE ALL TO 'caro_admin'@'localhost', 'martin_admin'@'localhost', 'tran_editor'@'localhost', 'wp_api'@'localhost';
3) Rechte prüfen: SHOW GRANTS
SHOW GRANTS FOR 'tran_editor'@'localhost'; -- Rolle "ausklappen": SHOW GRANTS FOR 'tran_editor'@'localhost' USING wp_editor; SHOW GRANTS FOR 'wp_api'@'localhost'; SELECT CURRENT_ROLE(); -- aktive Rollen der aktuellen Session
4) Funktions-Tests
Als tran_editor (Redakteur) verbinden
USE wttw; -- darf Inhalte pflegen: INSERT INTO posts(author_id, title, STATUS) VALUES (3,'Utrecht – 10 Sehenswürdigkeiten','draft'); -- ✅ UPDATE posts SET STATUS='published', published_at=NOW() WHERE post_id=LAST_INSERT_ID(); -- ✅ INSERT INTO comments(post_id, author, body) VALUES (1,'Leser','Toller Beitrag!'); -- ✅ -- kein DDL: DROP TABLE posts; -- ❌ (erwarteter Fehler)
Als wp_api (read-only Integration) verbinden
USE wttw; SELECT COUNT(*) FROM posts; -- ✅ INSERT INTO posts(author_id,title) VALUES (1,'hack'); -- ❌
5) REVOKE – Rechte entziehen (an Benutzer oder Rolle)
Temporär Kommentare sperren (alle Redakteure betroffen, da über Rolle):
-- als root: an der Rolle entziehen REVOKE INSERT, DELETE ON wttw.comments FROM wp_editor; -- Prüfung: SHOW GRANTS FOR 'tran_editor'@'localhost' USING wp_editor; -- Rückgängig machen: GRANT INSERT, DELETE ON wttw.comments TO wp_editor;
Gute Praxis:
- Least-Privilege umsetzen (wp_read/wp_author/wp_editor/wp_admin).
- Host nicht mit
%freigeben, wenn nicht nötig. - Standardrollen setzen (
SET DEFAULT ROLE). - Rechte regelmässig prüfen (
SHOW GRANTS).
</WRAP>