Files
MijnBesluit/db/03_inloggen_met_code.sql
T
2026-09-27 14:21:31 +00:00

59 lines
2.8 KiB
SQL

-- ============================================================================
-- 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;