调整文档路径
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
-- ============================================================
|
||||
-- MCP Auth — Bearer Token 动态鉴权管理库
|
||||
-- 数据库:mcp_auth(独立于业务库 smart_quotation_auto)
|
||||
-- 幂等可重跑:CREATE DATABASE 需手动执行(连接超库权限),下方表结构均 IF NOT EXISTS
|
||||
-- ============================================================
|
||||
|
||||
-- 0. 库(手动执行,或由 DBA 预建)
|
||||
-- CREATE DATABASE mcp_auth;
|
||||
|
||||
-- 1. mcp_token:token 主表
|
||||
CREATE TABLE IF NOT EXISTS mcp_token (
|
||||
token_id BIGSERIAL PRIMARY KEY,
|
||||
token_hash VARCHAR(64) UNIQUE NOT NULL, -- sha256(明文),verify 校验用
|
||||
token_plain VARCHAR(128), -- 明文 Token(管理后台二次复制用)
|
||||
token_prefix VARCHAR(16) NOT NULL, -- 明文前 12 字符 + '…',前端识别用
|
||||
client_id VARCHAR(64) NOT NULL, -- 调用方标识(如 trae / partner-a)
|
||||
service_scope VARCHAR(32) NOT NULL, -- 'erp' | 'crm'(服务标识)
|
||||
service_url VARCHAR(255), -- MCP 服务地址(如 http://10.100.154.100:8001/mcp)
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'active', -- active/revoked/expired
|
||||
expires_at TIMESTAMPTZ, -- null = 永不过期
|
||||
description VARCHAR(200), -- 用途说明
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
created_by VARCHAR(64) NOT NULL,
|
||||
revoked_at TIMESTAMPTZ,
|
||||
revoke_reason VARCHAR(200),
|
||||
last_used_at TIMESTAMPTZ,
|
||||
last_used_ip VARCHAR(64),
|
||||
last_used_svc VARCHAR(32) -- 最近被哪个 MCP 服务命中(erp/crm)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_mcp_token_status ON mcp_token(status) WHERE status = 'active';
|
||||
CREATE INDEX IF NOT EXISTS idx_mcp_token_client ON mcp_token(client_id);
|
||||
|
||||
-- 2. mcp_token_log:审计日志(可选,MCP 服务 verify_token 命中后异步写入)
|
||||
CREATE TABLE IF NOT EXISTS mcp_token_log (
|
||||
log_id BIGSERIAL PRIMARY KEY,
|
||||
token_id BIGINT NOT NULL REFERENCES mcp_token(token_id) ON DELETE CASCADE,
|
||||
event VARCHAR(32) NOT NULL, -- issued/verified/revoked/rejected/expired
|
||||
service VARCHAR(32), -- erp/crm
|
||||
client_ip VARCHAR(64),
|
||||
occurred_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
detail JSONB
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_mcp_token_log_token ON mcp_token_log(token_id, occurred_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_mcp_token_log_event ON mcp_token_log(event, occurred_at DESC);
|
||||
|
||||
-- 3. admin_user:管理员账号(bcrypt 密码哈希)
|
||||
CREATE TABLE IF NOT EXISTS admin_user (
|
||||
user_id BIGSERIAL PRIMARY KEY,
|
||||
username VARCHAR(64) UNIQUE NOT NULL,
|
||||
password_hash VARCHAR(128) NOT NULL, -- bcrypt
|
||||
display_name VARCHAR(64),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
last_login_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- 4. mcp_service:MCP 服务注册表(per-service API Key)
|
||||
CREATE TABLE IF NOT EXISTS mcp_service (
|
||||
service_id BIGSERIAL PRIMARY KEY,
|
||||
service_name VARCHAR(64) UNIQUE NOT NULL, -- erp / crm / ...
|
||||
service_url VARCHAR(255) UNIQUE NOT NULL, -- MCP 服务地址(如 http://10.100.154.100:8001/mcp),唯一
|
||||
api_key VARCHAR(128) NOT NULL, -- 明文 API Key(管理后台展示用,MCP 服务用此值)
|
||||
api_key_hash VARCHAR(64) UNIQUE NOT NULL, -- sha256(明文 API Key),verify-token 校验用
|
||||
description VARCHAR(200),
|
||||
status VARCHAR(16) NOT NULL DEFAULT 'active', -- active/revoked
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
created_by VARCHAR(64) NOT NULL,
|
||||
revoked_at TIMESTAMPTZ,
|
||||
last_used_at TIMESTAMPTZ
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_mcp_service_status ON mcp_service(status) WHERE status = 'active';
|
||||
|
||||
-- 5. 默认管理员(密码: admin123,bcrypt $2b$12$... 由后端首次启动时注入,此处仅占位)
|
||||
-- 实际部署:python -m backend.scripts.seed_admin 或由后端首次启动自动建
|
||||
-- 这里给出手工生成 bcrypt 的 SQL 模板(替换 $BCRYPT_HASH 为实际值):
|
||||
-- INSERT INTO admin_user (username, password_hash, display_name)
|
||||
-- VALUES ('admin', '$BCRYPT_HASH', '默认管理员')
|
||||
-- ON CONFLICT (username) DO NOTHING;
|
||||
@@ -0,0 +1,33 @@
|
||||
-- ============================================================
|
||||
-- mcp_service 表升级脚本:添加 MCP 服务地址字段(唯一约束)
|
||||
-- 适用:已部署的 mcp_auth 库(幂等可重跑)
|
||||
-- ============================================================
|
||||
|
||||
-- 1. 添加 service_url 列(允许 NULL,便于已有数据平滑过渡)
|
||||
ALTER TABLE mcp_service
|
||||
ADD COLUMN IF NOT EXISTS service_url VARCHAR(255);
|
||||
|
||||
-- 2. 为已有记录回填 service_url(按服务名推断默认地址,可按实际环境修改)
|
||||
UPDATE mcp_service
|
||||
SET service_url = 'http://10.100.154.100:' || (CASE service_name
|
||||
WHEN 'erp' THEN '8001'
|
||||
WHEN 'crm' THEN '8002'
|
||||
ELSE '8000' END) || '/mcp'
|
||||
WHERE service_url IS NULL;
|
||||
|
||||
-- 3. 设置为 NOT NULL
|
||||
ALTER TABLE mcp_service
|
||||
ALTER COLUMN service_url SET NOT NULL;
|
||||
|
||||
-- 4. 添加唯一约束(幂等:先检查约束是否存在)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_constraint
|
||||
WHERE conname = 'uk_mcp_service_url'
|
||||
AND conrelid = 'mcp_service'::regclass
|
||||
) THEN
|
||||
ALTER TABLE mcp_service
|
||||
ADD CONSTRAINT uk_mcp_service_url UNIQUE (service_url);
|
||||
END IF;
|
||||
END $$;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- ============================================================
|
||||
-- mcp_token 表升级脚本:添加 MCP 服务地址字段(签发时与服务标识一同保存)
|
||||
-- 适用:已部署的 mcp_auth 库(幂等可重跑)
|
||||
-- ============================================================
|
||||
|
||||
-- 1. 添加 service_url 列(可空,历史数据无地址信息)
|
||||
ALTER TABLE mcp_token
|
||||
ADD COLUMN IF NOT EXISTS service_url VARCHAR(255);
|
||||
|
||||
-- 2. 为已有记录按 service_scope 回填默认地址(可按实际环境修改)
|
||||
UPDATE mcp_token
|
||||
SET service_url = 'http://10.100.154.100:' || (CASE service_scope
|
||||
WHEN 'erp' THEN '8001'
|
||||
WHEN 'crm' THEN '8002'
|
||||
ELSE '8000' END) || '/mcp'
|
||||
WHERE service_url IS NULL;
|
||||
Reference in New Issue
Block a user