Eerste commit
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
-- ============================================================================
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user