Skip to content

Commit 84172ea

Browse files
committed
Support GitHub organization admin access
1 parent e34d834 commit 84172ea

8 files changed

Lines changed: 149 additions & 40 deletions

docs/github_pages_strategy_switch.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ GITHUB_CLIENT_SECRET
8282
SESSION_SECRET
8383
RUNTIME_SETTINGS_DISPATCH_TOKEN
8484
ALLOWED_GITHUB_LOGINS
85+
ALLOWED_GITHUB_ORGS
86+
STRATEGY_SWITCH_ADMIN_LOGINS
87+
STRATEGY_SWITCH_ADMIN_ORGS
8588
```
8689

8790
GitHub Actions Environment secret:
@@ -96,8 +99,8 @@ Do not reuse these tokens. `RUNTIME_SETTINGS_DISPATCH_TOKEN` only dispatches the
9699

97100
1. Merge `docs/index.html` and enable GitHub Pages from `/docs`.
98101
2. Configure `Manual Strategy Switch` and `RUNTIME_SETTINGS_GH_TOKEN`.
99-
3. Deploy the Worker with GitHub OAuth and `ALLOWED_GITHUB_LOGINS`.
100-
4. Test dispatch with `apply=false`.
102+
3. Deploy the Worker with GitHub OAuth, allowed users/orgs, and admin users/orgs.
103+
4. Test sign-in, account dropdown loading, and workflow dispatch with a controlled account.
101104
5. Test `apply=true` on a low-risk target.
102105

103106
## Why Pages Does Not Dispatch Directly

docs/github_pages_strategy_switch.zh-CN.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ GITHUB_CLIENT_SECRET
8282
SESSION_SECRET
8383
RUNTIME_SETTINGS_DISPATCH_TOKEN
8484
ALLOWED_GITHUB_LOGINS
85+
ALLOWED_GITHUB_ORGS
86+
STRATEGY_SWITCH_ADMIN_LOGINS
87+
STRATEGY_SWITCH_ADMIN_ORGS
8588
```
8689

8790
GitHub Actions Environment secret:
@@ -96,8 +99,8 @@ RUNTIME_SETTINGS_GH_TOKEN
9699

97100
1. 先合并 `docs/index.html`,启用 GitHub Pages,只发布只读控制台。
98101
2. 配置 `Manual Strategy Switch` workflow 和 `RUNTIME_SETTINGS_GH_TOKEN`
99-
3. 部署 Worker,配置 GitHub OAuth`ALLOWED_GITHUB_LOGINS`
100-
4. `apply=false` 测试网页触发 workflow。
102+
3. 部署 Worker,配置 GitHub OAuth、允许登录用户/组织和管理员用户/组织
103+
4. 先用受控账号测试登录、账号下拉和 workflow dispatch
101104
5. 再用低风险目标测试 `apply=true`
102105

103106
## 为什么不直接在 GitHub Pages 一键切换

docs/strategy_switch_admin_backend.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ Goal: keep the open-source switch page public and read-only by default, while al
66

77
- Login method: GitHub OAuth 2.0.
88
- Public access: unsigned visitors can view the page, but cannot dispatch the workflow.
9-
- Allowed switch users: `ALLOWED_GITHUB_LOGINS`, KV `auth_config.allowed_logins`, and all admins.
10-
- Admin users: `STRATEGY_SWITCH_ADMIN_LOGINS` plus KV `auth_config.admin_logins`.
9+
- Allowed switch users/orgs: `ALLOWED_GITHUB_LOGINS`, `ALLOWED_GITHUB_ORGS`, KV `auth_config.allowed_logins`, KV `auth_config.allowed_orgs`, and all admins.
10+
- Admin users/orgs: `STRATEGY_SWITCH_ADMIN_LOGINS`, `STRATEGY_SWITCH_ADMIN_ORGS`, KV `auth_config.admin_logins`, and KV `auth_config.admin_orgs`.
1111
- Account dropdowns: KV `account_options` first, falling back to `STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON`.
1212
- Audit log: each admin save appends to KV `audit_log`, capped at 50 entries.
1313

@@ -35,13 +35,14 @@ Without the KV binding, `/admin` is read-only and the Worker falls back to secre
3535

3636
- Not signed in: public read-only page.
3737
- Signed in but not allowlisted: no switch and no admin page.
38-
- Allowlisted: can dispatch switches.
39-
- Admin-listed: can open `/admin` and manage allowed logins, admin logins, and account dropdown JSON.
40-
- `STRATEGY_SWITCH_ADMIN_LOGINS` remains the break-glass admin source and is preserved on save.
38+
- Allowlisted users or organization members: can dispatch switches.
39+
- Admin users or admin organization members: can open `/admin` and manage allowed logins, allowed orgs, admin logins, admin orgs, and account dropdown JSON.
40+
- `STRATEGY_SWITCH_ADMIN_LOGINS` and `STRATEGY_SWITCH_ADMIN_ORGS` remain break-glass admin sources and are preserved on save.
4141

4242
## Security Boundary
4343

44-
- The admin backend stores GitHub logins and account routing metadata only.
44+
- The admin backend stores GitHub logins, GitHub organization names, and account routing metadata only.
45+
- OAuth requests the `read:org` scope to verify membership in configured admin or allowlist organizations.
4546
- Broker passwords, tokens, API keys, and cloud credentials stay out of this config.
4647
- Admin writes use POST and same-origin checks.
4748
- Sessions use HttpOnly, Secure, SameSite=Lax, and HMAC-signed cookies.

docs/strategy_switch_admin_backend.zh-CN.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
- 登录方式:GitHub OAuth 2.0。
88
- 公开访问:未登录用户只能看到只读切换页,不能触发 workflow。
9-
- 可切换用户:来自 `ALLOWED_GITHUB_LOGINS`、KV `auth_config.allowed_logins` 和管理员名单
10-
- 管理员:来自 `STRATEGY_SWITCH_ADMIN_LOGINS` 和 KV `auth_config.admin_logins`
9+
- 可切换用户/组织:来自 `ALLOWED_GITHUB_LOGINS``ALLOWED_GITHUB_ORGS`KV `auth_config.allowed_logins`、KV `auth_config.allowed_orgs` 和管理员配置
10+
- 管理员用户/组织:来自 `STRATEGY_SWITCH_ADMIN_LOGINS``STRATEGY_SWITCH_ADMIN_ORGS`、KV `auth_config.admin_logins` 和 KV `auth_config.admin_orgs`
1111
- 账号下拉:优先读取 KV `account_options`,没有 KV 配置时回退 `STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON`
1212
- 审计:管理员保存配置后写入 KV `audit_log`,保留最近 50 条。
1313

@@ -35,13 +35,14 @@ audit_log
3535

3636
- 未登录:只能查看公开页面。
3737
- 登录但不在 allowlist:不能切换,也不能进入后台。
38-
- allowlist 用户:可以一键切换。
39-
- admin 用户:可以进入 `/admin`,维护 allowlist、admin list 和账号下拉 JSON。
40-
- `STRATEGY_SWITCH_ADMIN_LOGINS` 是兜底管理员来源,后台保存时会自动保留,避免把自己锁在外面。
38+
- allowlist 用户或组织成员:可以一键切换。
39+
- admin 用户或管理员组织成员:可以进入 `/admin`,维护 allowlist、admin list、组织名单和账号下拉 JSON。
40+
- `STRATEGY_SWITCH_ADMIN_LOGINS` `STRATEGY_SWITCH_ADMIN_ORGS` 是兜底管理员来源,后台保存时会自动保留,避免把自己锁在外面。
4141

4242
## 安全边界
4343

44-
- 后台只保存 GitHub login 和账号路由信息。
44+
- 后台只保存 GitHub login、GitHub 组织名和账号路由信息。
45+
- OAuth 会请求 `read:org` scope,用于校验登录用户是否属于配置的管理员组织或 allowlist 组织。
4546
- 不保存 broker 密码、token、API key 或云密钥。
4647
- 后台写操作使用 POST,并校验 Same-Origin。
4748
- session cookie 使用 HttpOnly、Secure、SameSite=Lax 和 HMAC 签名。

web/strategy-switch-console/README.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ GITHUB_CLIENT_SECRET
1414
SESSION_SECRET
1515
RUNTIME_SETTINGS_DISPATCH_TOKEN
1616
ALLOWED_GITHUB_LOGINS
17+
ALLOWED_GITHUB_ORGS
1718
STRATEGY_SWITCH_ADMIN_LOGINS
19+
STRATEGY_SWITCH_ADMIN_ORGS
1820
```
1921

2022
Optional variables:
@@ -26,10 +28,11 @@ RUNTIME_SETTINGS_REF=main
2628
STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON=<contents of account-options.example.json>
2729
```
2830

29-
`ALLOWED_GITHUB_LOGINS` and `STRATEGY_SWITCH_ADMIN_LOGINS` are comma-separated lists:
31+
`ALLOWED_GITHUB_LOGINS`, `ALLOWED_GITHUB_ORGS`, `STRATEGY_SWITCH_ADMIN_LOGINS`, and `STRATEGY_SWITCH_ADMIN_ORGS` are comma-separated lists. Prefer the organization name for admin access:
3032

3133
```text
32-
your-github-login
34+
STRATEGY_SWITCH_ADMIN_ORGS=QuantStrategyLab
35+
STRATEGY_SWITCH_ADMIN_LOGINS=your-github-login
3336
```
3437

3538
The login entrypoint is `/login` on the Worker domain. The page header keeps a single Login Management entry. After sign-in, `/api/session` returns:
@@ -43,11 +46,11 @@ The login entrypoint is `/login` on the Worker domain. The page header keeps a s
4346
}
4447
```
4548

46-
`admin=true` means the login is listed in `STRATEGY_SWITCH_ADMIN_LOGINS` or the KV-backed admin list. Open `/admin` to manage allowed GitHub logins and account dropdown routes; non-admin users receive 403.
49+
`admin=true` means the login or one of its GitHub organizations is listed in `STRATEGY_SWITCH_ADMIN_LOGINS`, `STRATEGY_SWITCH_ADMIN_ORGS`, or the KV-backed admin config. Open `/admin` to manage allowed GitHub logins, organizations, and account dropdown routes; non-admin users receive 403.
4750

4851
## Admin Management
4952

50-
GitHub OAuth 2.0 is the only login method. Keep your own GitHub login in `STRATEGY_SWITCH_ADMIN_LOGINS`; that secret is the break-glass admin source and cannot be removed from the UI.
53+
GitHub OAuth 2.0 is the only login method. The Worker requests the `read:org` scope to verify GitHub organization membership. Put `QuantStrategyLab` in `STRATEGY_SWITCH_ADMIN_ORGS`, and keep your own GitHub login in `STRATEGY_SWITCH_ADMIN_LOGINS` as a break-glass admin.
5154

5255
For editable admin settings, bind a Cloudflare KV namespace named `STRATEGY_SWITCH_CONFIG`. The Worker uses these KV keys:
5356

@@ -57,7 +60,7 @@ account_options
5760
audit_log
5861
```
5962

60-
Without the KV binding, `/admin` is read-only and the Worker falls back to `ALLOWED_GITHUB_LOGINS`, `STRATEGY_SWITCH_ADMIN_LOGINS`, and `STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON`.
63+
Without the KV binding, `/admin` is read-only and the Worker falls back to `ALLOWED_GITHUB_LOGINS`, `ALLOWED_GITHUB_ORGS`, `STRATEGY_SWITCH_ADMIN_LOGINS`, `STRATEGY_SWITCH_ADMIN_ORGS`, and `STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON`.
6164

6265
## Page Asset
6366

@@ -130,7 +133,9 @@ wrangler secret put GITHUB_CLIENT_SECRET
130133
wrangler secret put SESSION_SECRET
131134
wrangler secret put RUNTIME_SETTINGS_DISPATCH_TOKEN
132135
wrangler secret put ALLOWED_GITHUB_LOGINS
136+
wrangler secret put ALLOWED_GITHUB_ORGS
133137
wrangler secret put STRATEGY_SWITCH_ADMIN_LOGINS
138+
wrangler secret put STRATEGY_SWITCH_ADMIN_ORGS
134139
wrangler secret put STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON < /tmp/strategy-switch-accounts.json
135140
```
136141

web/strategy-switch-console/README.zh-CN.md

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ GITHUB_CLIENT_SECRET
1616
SESSION_SECRET
1717
RUNTIME_SETTINGS_DISPATCH_TOKEN
1818
ALLOWED_GITHUB_LOGINS
19+
ALLOWED_GITHUB_ORGS
1920
STRATEGY_SWITCH_ADMIN_LOGINS
21+
STRATEGY_SWITCH_ADMIN_ORGS
2022
```
2123

2224
可选:
@@ -28,10 +30,11 @@ RUNTIME_SETTINGS_REF=main
2830
STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON=<account-options.example.json 的内容>
2931
```
3032

31-
`ALLOWED_GITHUB_LOGINS``STRATEGY_SWITCH_ADMIN_LOGINS` 用英文逗号分隔,例如:
33+
`ALLOWED_GITHUB_LOGINS``ALLOWED_GITHUB_ORGS``STRATEGY_SWITCH_ADMIN_LOGINS``STRATEGY_SWITCH_ADMIN_ORGS` 用英文逗号分隔。个人系统建议用组织名做管理员入口,例如:
3234

3335
```text
34-
your-github-login
36+
STRATEGY_SWITCH_ADMIN_ORGS=QuantStrategyLab
37+
STRATEGY_SWITCH_ADMIN_LOGINS=your-github-login
3538
```
3639

3740
登录入口是 Worker 域名下的 `/login`,页面顶部保留一个“登录管理”入口。登录成功后访问 `/api/session` 会返回:
@@ -45,11 +48,11 @@ your-github-login
4548
}
4649
```
4750

48-
`admin=true` 表示该账号在 `STRATEGY_SWITCH_ADMIN_LOGINS` 或 KV 后台管理员名单中。直接访问 `/admin` 可以管理允许登录的 GitHub 用户和账号下拉路由;非管理员会返回 403。
51+
`admin=true` 表示该账号在 `STRATEGY_SWITCH_ADMIN_LOGINS``STRATEGY_SWITCH_ADMIN_ORGS`或 KV 后台管理员名单/组织中。直接访问 `/admin` 可以管理允许登录的 GitHub 用户、组织和账号下拉路由;非管理员会返回 403。
4952

5053
## 登录管理后台
5154

52-
登录方式使用 GitHub OAuth 2.0。建议把你自己的 GitHub login 放在 `STRATEGY_SWITCH_ADMIN_LOGINS`,它是兜底管理员来源,后台里不能把这个入口删掉
55+
登录方式使用 GitHub OAuth 2.0,并请求 `read:org` scope 来校验 GitHub 组织成员关系。建议把 `QuantStrategyLab` 放在 `STRATEGY_SWITCH_ADMIN_ORGS`,同时把你自己的 GitHub login 放在 `STRATEGY_SWITCH_ADMIN_LOGINS` 作为兜底管理员
5356

5457
如果要让 `/admin` 保存修改,需要绑定 Cloudflare KV namespace:`STRATEGY_SWITCH_CONFIG`。Worker 会使用这些 key:
5558

@@ -59,7 +62,7 @@ account_options
5962
audit_log
6063
```
6164

62-
没有绑定 KV 时,`/admin` 只读;Worker 会回退读取 `ALLOWED_GITHUB_LOGINS``STRATEGY_SWITCH_ADMIN_LOGINS``STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON`
65+
没有绑定 KV 时,`/admin` 只读;Worker 会回退读取 `ALLOWED_GITHUB_LOGINS``ALLOWED_GITHUB_ORGS``STRATEGY_SWITCH_ADMIN_LOGINS``STRATEGY_SWITCH_ADMIN_ORGS``STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON`
6366

6467
## 文件结构
6568

@@ -136,7 +139,9 @@ wrangler secret put GITHUB_CLIENT_SECRET
136139
wrangler secret put SESSION_SECRET
137140
wrangler secret put RUNTIME_SETTINGS_DISPATCH_TOKEN
138141
wrangler secret put ALLOWED_GITHUB_LOGINS
142+
wrangler secret put ALLOWED_GITHUB_ORGS
139143
wrangler secret put STRATEGY_SWITCH_ADMIN_LOGINS
144+
wrangler secret put STRATEGY_SWITCH_ADMIN_ORGS
140145
wrangler secret put STRATEGY_SWITCH_ACCOUNT_OPTIONS_JSON < /tmp/strategy-switch-accounts.json
141146
```
142147

@@ -165,7 +170,7 @@ wrangler deploy
165170
1. 访问控制台页面。
166171
2. 未登录时只能查看公开示例,“一键切换”按钮禁用。
167172
3. 点击“登录管理”,也可以直接访问 `/login`
168-
4. 如果登录账号在 `ALLOWED_GITHUB_LOGINS``STRATEGY_SWITCH_ADMIN_LOGINS`,且账号配置已加载,按钮启用。
173+
4. 如果登录账号在 allowlist 用户/组织或管理员用户/组织中,且账号配置已加载,按钮启用。
169174
5. 顶部只保留“登录管理”入口;如果登录账号是管理员,点击后进入 `/admin` 管理登录权限和账号下拉。
170175
6. 选择平台、账号、策略和模式后点击“一键切换”。
171176
7. 页面返回 GitHub Actions 链接,用于查看运行结果。

0 commit comments

Comments
 (0)