Files
MijnBesluit/db/02_applicatiegebruiker.sql
jfandClaude Sonnet 5.5 5446dd4170 Versiehistorie in een tabel, voor site en app
De versiehistorie stond als tekst in zowel de app als de website. Nu staat hij in
tabel version_history, met een beheerpagina (Beheer > Versiehistorie) op de site.
De site leest de tabel rechtstreeks, de app via de nieuwe actie app.versiehistorie.
Startrijen: db/handmatig/22b_versiehistorie_startrijen.sql (als root).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MGLqt1uKfNARQHut9ifcx
2026-10-20 11:47:06 +00:00

67 lines
4.6 KiB
SQL

-- ============================================================================
-- Een aparte databasegebruiker voor de applicatie, met alleen de rechten die
-- hij nodig heeft: geen CREATE, geen DROP, geen ALTER. Schemawijzigingen doe
-- je met een migratie onder je eigen account, niet vanuit de draaiende
-- applicatie.
--
-- Vervang het wachtwoord hieronder en bewaar het niet in de broncode --
-- zie docs/Beveiliging.md, "Waar de geheimen staan".
--
-- Draaien (in cmd, NIET in PowerShell):
-- mysql -u root -p < 02_applicatiegebruiker.sql
--
-- Opnieuw draaien mag en is veilig: CREATE USER IF NOT EXISTS slaat de hele regel over als de
-- gebruiker al bestaat, dus het wachtwoord verandert niet. Dat is precies wat je doet als er
-- tabellen bij zijn gekomen.
--
-- LET OP: komt er een tabel bij, dan hoort hij hier ook bij te staan. Zonder recht krijgt de
-- applicatie "SELECT command denied" - en dat merk je pas als iemand dat scherm opent. Er is
-- een zelftest die elke CREATE TABLE in deze map naast deze lijst legt.
--
-- En hier, in DIT bestand, en nergens anders. Sommige migratiescripts deelden vroeger zelf
-- rechten uit, vlak onder hun CREATE TABLE. Dat leest prettig, maar de scripts vanaf 03 worden
-- ook door de uitrolagent gedraaid met een beperkt databaseaccount, en dat mag geen rechten
-- uitdelen: de uitrol struikelde er dan op. Rechten uitdelen is inrichten, en dat doet een mens
-- één keer als root. De zelftest bewaakt ook dat.
-- ============================================================================
CREATE USER IF NOT EXISTS 'mijnbesluit_app'@'localhost'
IDENTIFIED BY 'VERVANG_DIT_WACHTWOORD';
-- De rechten worden per tabel gegeven en niet in één keer op de hele database.
-- Dat is met opzet: rechten in MariaDB zijn optellend, dus een recht dat op
-- databaseniveau is gegeven kun je op tabelniveau niet meer afnemen. Wil je
-- het logboek onwijzigbaar houden, dan mag UPDATE/DELETE op de database dus
-- nooit gegeven worden.
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`persons` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`users` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`families` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`family_members` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`invitations` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_items` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_files` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`content_grants` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`messages` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`death_declarations` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`legacy_managers` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`refresh_tokens` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`login_codes` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`toestellen` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`samenvoegingen` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`adverteerders` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`campagnes` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`campagne_uren` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`sessies` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_categories` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_category_fields` TO 'mijnbesluit_app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`version_history` TO 'mijnbesluit_app'@'localhost';
-- Het logboek mag er alleen bij komen en uit gelezen worden, niet uit verdwijnen.
GRANT SELECT, INSERT ON `mijnbesluit`.`audit_log` TO 'mijnbesluit_app'@'localhost';
FLUSH PRIVILEGES;
-- Controle: audit_log hoort alleen SELECT en INSERT te hebben, de rest alles behalve DDL.
SHOW GRANTS FOR 'mijnbesluit_app'@'localhost';