feat(db): 迁移里的数据库角色名改为环境变量注入
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
"""迁移里用到的数据库角色名。
|
||||
|
||||
为什么要有这个模块:RLS 的隔离强度取决于「应用角色不是表 owner、没有 BYPASSRLS」。
|
||||
开发和生产的库在同一个 PG 实例上(fnsvr-01:8432),如果两边共用 `dadao_app` 角色,
|
||||
拿到开发口令的人就能直连生产库——所以生产用独立角色,由迁移时的环境变量注入。
|
||||
|
||||
默认值就是开发/测试的角色名,所以本地和 CI 行为不变。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
# PostgreSQL 标识符:小写字母/数字/下划线,且不能以数字开头
|
||||
_ROLE_RE = re.compile(r"^[a-z_][a-z0-9_]{0,62}$")
|
||||
|
||||
|
||||
def _role_from_env(env_name: str, default: str) -> str:
|
||||
value = os.getenv(env_name, default)
|
||||
if not _ROLE_RE.match(value):
|
||||
raise RuntimeError(f"{env_name} 不是合法的 PostgreSQL 角色名:{value!r}")
|
||||
return value
|
||||
|
||||
|
||||
# 迁移角色(owner,可建表,绕过 RLS)与应用角色(只能读写数据,受 RLS 约束)
|
||||
OWNER_ROLE = _role_from_env("OWNER_DB_ROLE", "dadao_owner")
|
||||
APP_ROLE = _role_from_env("APP_DB_ROLE", "dadao_app")
|
||||
Reference in New Issue
Block a user