-- ============================================================================ -- Overstap van wachtwoorden naar inloggen met een code per e-mail. -- -- Draai dit op een database die met een eerdere versie van 01_schema.sql is -- aangemaakt. Op een verse database is dit niet nodig: 01_schema.sql bevat -- alles al. -- -- Draaien (in cmd, NIET in PowerShell), of in HeidiSQL via -- Bestand -> SQL-bestand uitvoeren: -- mysql -u root -p < 03_inloggen_met_code.sql -- -- Het script mag meerdere keren gedraaid worden. -- ============================================================================ USE `mijnbesluit`; -- 1. De tabel met eenmalige codes. CREATE TABLE IF NOT EXISTS `login_codes` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `email` VARCHAR(255) NOT NULL, `purpose` INT NOT NULL DEFAULT 0, -- 0 inloggen, 1 registreren `code_hash` VARCHAR(255) NOT NULL, `first_name` VARCHAR(80) NULL, `last_name` VARCHAR(80) NULL, `created_at` DATETIME(3) NOT NULL, `expires_at` DATETIME(3) NOT NULL, `consumed_at` DATETIME(3) NULL, `attempts` INT NOT NULL DEFAULT 0, `requested_from_ip` VARCHAR(45) NULL, PRIMARY KEY (`id`), KEY `ix_login_codes_open` (`email`, `purpose`, `expires_at`), KEY `ix_login_codes_created` (`email`, `created_at`) ) ENGINE=InnoDB; -- 2. De wachtwoordkolom weg. ALTER TABLE kent geen "DROP COLUMN IF EXISTS" in -- elke MariaDB-versie, dus eerst kijken of hij er staat. SET @kolom := (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'password_hash'); SET @sql := IF(@kolom > 0, 'ALTER TABLE `users` DROP COLUMN `password_hash`', 'DO 0'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 3. De rechten voor de applicatiegebruiker staan NIET hier maar in 02_applicatiegebruiker.sql. -- -- Waarom: de scripts vanaf 03 worden ook door de uitrolagent gedraaid, met een beperkt -- databaseaccount dat geen rechten mág uitdelen. Een GRANT hier laat die hele uitrol struikelen, -- en dat account meer macht geven is de verkeerde kant op. Rechten uitdelen is inrichten; dat -- doet een mens één keer als root. Een zelfcontrole legt elke CREATE TABLE in deze map naast de -- lijst in 02, dus vergeten kan niet ongemerkt. -- Controle. SELECT 'login_codes' AS tabel, (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'login_codes') AS bestaat, (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' AND COLUMN_NAME = 'password_hash') AS wachtwoordkolom_nog_aanwezig;