feat(members): split username/display_name, sync updates to authentik, add password reset API and refresh docs
This commit is contained in:
@@ -1,91 +1,42 @@
|
||||
# DB Schema(新架構)
|
||||
# DB Schema(現行)
|
||||
|
||||
## 1) 設計原則
|
||||
- 權限以群組為中心,不使用會員直接細粒度授權流程
|
||||
- `scope` 固定為 `site`
|
||||
- `action` 只允許 `view`、`edit`(可同時存在)
|
||||
- DB 真實執行來源:`backend/scripts/init_schema.sql`
|
||||
## 真實來源
|
||||
- `backend/scripts/init_schema.sql`
|
||||
- 線上增量:`backend/scripts/migrate_add_users_username.sql`
|
||||
|
||||
## 2) 核心實體
|
||||
- `companies`
|
||||
- `id` (PK)
|
||||
- `company_key` (UNIQUE)
|
||||
- `name`, `status`, `created_at`, `updated_at`
|
||||
- `sites`
|
||||
- `id` (PK)
|
||||
- `site_key` (UNIQUE)
|
||||
- `company_id` (FK -> companies.id)
|
||||
- `name`, `status`, `created_at`, `updated_at`
|
||||
## 主要表
|
||||
- `users`
|
||||
- `id` (PK)
|
||||
- `authentik_sub` (UNIQUE)
|
||||
- `authentik_user_id`, `email` (UNIQUE), `display_name`, `is_active`
|
||||
- `authentik_sub` UNIQUE
|
||||
- `authentik_user_id` INTEGER
|
||||
- `username` UNIQUE
|
||||
- `email` UNIQUE
|
||||
- `display_name`
|
||||
- `is_active`, `status`, timestamps
|
||||
- `companies`
|
||||
- `sites`(`company_id -> companies.id`)
|
||||
- `systems`
|
||||
- `id` (PK)
|
||||
- `system_key` (UNIQUE)
|
||||
- `name`, `status`
|
||||
- `modules`
|
||||
- `id` (PK)
|
||||
- `module_key` (UNIQUE)
|
||||
- `system_id` (FK -> systems.id)
|
||||
- `name`, `status`
|
||||
- `modules`(`system_key -> systems.system_key`)
|
||||
- `permission_groups`
|
||||
- `id` (PK)
|
||||
- `group_key` (UNIQUE)
|
||||
- `name`, `status`
|
||||
- `permission_group_members`(group + authentik_sub)
|
||||
- `permission_group_permissions`(group + site/system/module/action)
|
||||
- `user_scope_permissions`(相容保留)
|
||||
- `api_clients`(保留給機器對機器用途)
|
||||
|
||||
## 3) 群組關聯(多對多)
|
||||
- `permission_group_members`
|
||||
- `group_id` (FK -> permission_groups.id)
|
||||
- `user_id` (FK -> users.id)
|
||||
- UNIQUE (`group_id`, `user_id`)
|
||||
- `permission_group_sites`
|
||||
- `group_id` (FK -> permission_groups.id)
|
||||
- `site_id` (FK -> sites.id)
|
||||
- UNIQUE (`group_id`, `site_id`)
|
||||
- `permission_group_systems`
|
||||
- `group_id` (FK -> permission_groups.id)
|
||||
- `system_id` (FK -> systems.id)
|
||||
- UNIQUE (`group_id`, `system_id`)
|
||||
- `permission_group_modules`
|
||||
- `group_id` (FK -> permission_groups.id)
|
||||
- `module_id` (FK -> modules.id)
|
||||
- UNIQUE (`group_id`, `module_id`)
|
||||
- `permission_group_actions`
|
||||
- `group_id` (FK -> permission_groups.id)
|
||||
- `action` (`view` | `edit`)
|
||||
- UNIQUE (`group_id`, `action`)
|
||||
## 權限規則
|
||||
- `scope_type='site'`
|
||||
- `action in ('view','edit')`
|
||||
|
||||
## 4) 查詢預期
|
||||
- 系統頁關聯:
|
||||
- 查 `permission_group_systems` 取群組
|
||||
- 經 `permission_group_members` 推導涉及會員
|
||||
- 模組頁關聯:
|
||||
- 查 `permission_group_modules` 取群組
|
||||
- 經 `permission_group_members` 推導涉及會員
|
||||
- 公司頁站台:
|
||||
- 查 `sites` by `company_id`
|
||||
- 會員頁群組:
|
||||
- 查 `permission_group_members` by `user_id`
|
||||
## 會員與 Authentik 對齊
|
||||
- `users.authentik_sub` 對應 Authentik `uid`
|
||||
- `users.username` 對應 Authentik `username`
|
||||
- `users.display_name` 對應 Authentik `name`
|
||||
|
||||
## 5) 驗收查核(SQL)
|
||||
## 快速檢查 SQL
|
||||
```sql
|
||||
-- 1) 檢查主表是否存在
|
||||
SELECT tablename
|
||||
FROM pg_tables
|
||||
WHERE schemaname = 'public'
|
||||
AND tablename IN (
|
||||
'companies','sites','users','systems','modules','permission_groups',
|
||||
'permission_group_members','permission_group_sites',
|
||||
'permission_group_systems','permission_group_modules','permission_group_actions'
|
||||
)
|
||||
ORDER BY tablename;
|
||||
SELECT column_name, data_type
|
||||
FROM information_schema.columns
|
||||
WHERE table_name='users'
|
||||
ORDER BY ordinal_position;
|
||||
|
||||
-- 2) 檢查 action 值域
|
||||
SELECT DISTINCT action FROM permission_group_actions ORDER BY action;
|
||||
|
||||
-- 3) 檢查群組可同時有 view/edit
|
||||
SELECT group_id, array_agg(action ORDER BY action) AS actions
|
||||
FROM permission_group_actions
|
||||
GROUP BY group_id;
|
||||
SELECT COUNT(*) FROM users WHERE username IS NULL;
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user