Files
MijnBesluit/db/02_applicatiegebruiker.sql
T
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';