From 7d2a1f0ea502e247d0c2f413d308da01a8dcf132 Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 25 Jun 2026 21:12:40 +0800 Subject: [PATCH] =?UTF-8?q?docs(auth):=20=E5=90=8C=E6=AD=A5=E5=8E=BB?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E2=80=94=E2=80=94=E5=BC=BA=E5=88=B6=20DATABA?= =?UTF-8?q?SE=5FURL=20+=20=E8=A1=A5=20wall=5Fusers=20=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- docs/auth-login-gate.md | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/docs/auth-login-gate.md b/docs/auth-login-gate.md index 7d08211..be0fe5b 100644 --- a/docs/auth-login-gate.md +++ b/docs/auth-login-gate.md @@ -1,6 +1,6 @@ # 登录 + 开发者入口门(MySQL 后端) -两道关卡,都由后端 Rust(`Server/src/auth.rs`)实现,**默认实时查 MySQL**: +两道关卡,都由后端 Rust(`Server/src/auth.rs`)实现,**实时查 MySQL(无兜底)**: 1. **入口门(藏门)**:起始页没有任何登录 UI 入口(设置齿轮已移除)。只有访问 `http:///#` 且 `` 命中后端 `dev_gate` 表,前端才放行到登录页。 @@ -24,16 +24,17 @@ 回起始页时抹掉地址栏 hash)、登录 `Client/src/api/auth.ts`。 - 后端:`Server/src/auth.rs`、路由 `Server/src/routes/web.rs` 的 `/api/web/gate`、`/api/web/login`。 -## 存储:MySQL(不缓存,按需查库) +## 存储:MySQL(不缓存,按需查库,**无兜底**) -机器内存紧张,所以**不把整表读进内存**:`UserStore` 与 `DevGate` 都是 -`Db(pool) | Memory(兜底)` 两态,DB 模式下每次校验跑一条索引查询。 -二者**共用同一个 sqlx 懒连接池**(`auth::db_pool_from_env()`,max 5 连接),避免开两份连接。 +机器内存紧张,所以**不把整表读进内存**:`UserStore`(`ccuser`)、`WallUserStore` +(`wall_users`,照片墙登录)、`DevGate`(`dev_gate`)三者各持一个连接池,每次校验跑一条 +索引查询。**共用同一个 sqlx 懒连接池**(`auth::db_pool_from_env()`,max 5 连接)。 - 连接串来自环境变量 `DATABASE_URL`(线上写在 `/opt/internet-project/weather.env`): `mysql://KarCharon:@127.0.0.1:3306/InternetProject` -- **未设 `DATABASE_URL`** → 各自回退:用户用内置写死表(仅 `cc`)、入口门读 `GATE_FILE` - (默认 `dev_gate.txt`)再退内置。方便本地无 DB 时开发。 +- **强制要求 `DATABASE_URL`**:未设置则 `db_pool_from_env()` 直接 `panic`,服务拒绝启动。 + **不再有任何写死账号 / 文件兜底**(旧的内置写死表、`GATE_FILE`/`dev_gate.txt` 文件模式 + 已全部删除)——登录与入口门一律走数据库。本地开发也必须先把库搭好(见下)。 - 依赖:`sqlx 0.8`,features `runtime-tokio, tls-rustls, mysql, macros`。 ### 表结构(库 `InternetProject`,utf8mb4) @@ -51,22 +52,34 @@ CREATE TABLE dev_gate ( label VARCHAR(64) DEFAULT NULL, -- 备注(开发者名) created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); +CREATE TABLE wall_users ( -- 照片墙登录,与 ccuser 物理隔离 + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(64) NOT NULL UNIQUE, + password_sha256 CHAR(64) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); ``` -- 加用户:`INSERT INTO ccuser (username, password_sha256) VALUES ('名', SHA2('明文',256));` +- 加开发者用户:`INSERT INTO ccuser (username, password_sha256) VALUES ('名', SHA2('明文',256));` +- 加照片墙用户:`INSERT INTO wall_users (username, password_sha256) VALUES ('名', SHA2('明文',256));` - 加开发者入口:`INSERT INTO dev_gate (gate_hash, label) VALUES ('', '名');` - (DB 模式即时生效,无需重启。) + (即时生效,无需重启。) - 当前 `cc`:登录密码 `192118Lht`;入口 hash `0086e83c9b10`(= 该密码 SHA256 的前 12 位)。 + 照片墙用户另有 `UserTest`(文件夹 607)、`UserTest6340`(文件夹 6340)。 -## 一次性搭库(服务器本机,MySQL 仅监听 127.0.0.1) +## 一次性搭库(服务器本机 / 本地开发,MySQL/MariaDB 仅监听 127.0.0.1) ```sql CREATE DATABASE InternetProject CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE USER 'KarCharon'@'localhost' IDENTIFIED WITH mysql_native_password BY ''; +CREATE USER 'KarCharon'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON InternetProject.* TO 'KarCharon'@'localhost'; --- 然后建上面两张表、插入初始数据。 +-- 然后建上面三张表(ccuser / dev_gate / wall_users)、插入初始数据。 ``` +> 因为已**去兜底**,本地开发同样要先搭库(无 DB 启动即 panic)。MariaDB 即可,与 MySQL +> 兼容(`SHA2()`、`mysql_native_password` 均支持)。启动后端时带上连接串: +> `DATABASE_URL='mysql://KarCharon:@127.0.0.1:3306/InternetProject' cargo run` + ## 安全注记(待办) - 密码是**裸 SHA256(无盐)**,仅保证「不落明文」,不抗暴力破解。对外网开放前应换