59 lines
2.8 KiB
SQL
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;
|