From e4118d7b1d9a790238554dba4943b10133f6582a Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 26 May 2026 13:59:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=90=8E=E5=8F=B0=20?= =?UTF-8?q?RBAC=20=E6=96=87=E6=A1=A3=E4=B8=8E=E6=9D=83=E9=99=90=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 `AGENTS.md` 中新增后台 RBAC 相关说明,强调 `php artisan lottery:admin-auth-sync --audit` 的使用。 - 更新 `README.md`,明确本地重置演示数据的命令,并补充 `AdminAuthorizationRegistry` 的同步要求。 - 精简 `AdminDashboardAnalyticsBuilder` 中的权限检查逻辑,确保与 `AdminAuthorizationRegistry` 一致。 - 在 `admin-rbac.md` 中添加仪表盘 API 权限要求的详细信息,优化维护命令的描述。 --- AGENTS.md | 4 ++++ README.md | 5 ++--- app/Services/Admin/AdminDashboardAnalyticsBuilder.php | 8 ++------ docs/admin-rbac.md | 9 ++++++++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index e4bdd42..2dd3c9b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,3 +15,7 @@ 用户明确要求 `migrate:fresh` 时:先说明目标库名与数据将全部丢失,待用户确认后再执行。 详见 `.cursor/rules/database-destructive-commands.mdc`。 + +## 后台 RBAC + +改 `app/Support/AdminAuthorizationRegistry.php` 后,在已有库执行 `php artisan lottery:admin-auth-sync --audit`(见 `docs/admin-rbac.md`)。`migrate:fresh --seed` 会走迁移内的 resync,一般不必再手动 sync。 diff --git a/README.md b/README.md index caeb72a..7d79649 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Boost provides your agent 15+ tools and skills that help agents build Laravel ap 在 **本仓库根目录**(即含 `artisan` 的 `lotterLaravel` 目录)开 **3 个终端**,每段整段复制即可。若已用 Herd / Valet / Sail / 自有 Web 服务器指到 `public`,可不跑「终端 1」。 -**前置(首次)**:`cp .env.example .env`,`composer install`,`php artisan key:generate`,`php artisan migrate`(及你的库表/种子)。 +**前置(首次)**:`cp .env.example .env`,`composer install`,`php artisan key:generate`,`php artisan migrate`(及你的库表/种子)。本地重置演示数据可用 `php artisan migrate:fresh --seed`(会清空当前库)。若只改了 `AdminAuthorizationRegistry` 而未新增迁移,还需 `php artisan lottery:admin-auth-sync --audit`。 **终端 1 — HTTP API** @@ -95,8 +95,7 @@ php artisan schedule:work 后台权限现在提供了一条可直接接入 CI 的体检命令,用来检查: - 受保护后台路由是否都已登记到 `admin_api_resources` -- `permission_required` 资源是否已绑定 `admin_api_resource_bindings` -- `admin_role_menu_actions` 与 `admin_role_api_resources` 是否漂移 +- `permission_required` 资源是否已在 `admin_api_resource_bindings` 绑定 `admin_menu_actions`(鉴权由 `admin_role_menu_actions` + bindings 推导,不再使用已删除的 `admin_role_api_resources` 表) 本地可直接执行: diff --git a/app/Services/Admin/AdminDashboardAnalyticsBuilder.php b/app/Services/Admin/AdminDashboardAnalyticsBuilder.php index a4069ef..1bffdba 100644 --- a/app/Services/Admin/AdminDashboardAnalyticsBuilder.php +++ b/app/Services/Admin/AdminDashboardAnalyticsBuilder.php @@ -70,13 +70,9 @@ final class AdminDashboardAnalyticsBuilder ]; } + /** 与 {@see AdminAuthorizationRegistry} 中 dashboard 类 API 资源的 `dashboard.view` 绑定一致。 */ private function canView(AdminUser $admin): bool { - return $admin->hasAdminPermission('prd.dashboard.view') - || $admin->hasAdminPermission('prd.draw_result.manage') - || $admin->hasAdminPermission('prd.draw_result.view') - || $admin->hasAdminPermission('prd.risk.view') - || $admin->hasAdminPermission('prd.risk.manage') - || $admin->hasAdminPermission('prd.report.view'); + return $admin->hasAdminPermission('prd.dashboard.view'); } } diff --git a/docs/admin-rbac.md b/docs/admin-rbac.md index 559d962..8e8a1d1 100644 --- a/docs/admin-rbac.md +++ b/docs/admin-rbac.md @@ -24,9 +24,16 @@ ```bash php artisan lottery:admin-auth-sync --audit # 同步 API 资源与 bindings,并体检 -php artisan lottery:admin-auth-audit # 仅体检路由覆盖与 binding +php artisan lottery:admin-auth-audit # 仅体检:受保护路由是否登记、permission_required 是否已绑定 ``` +`migrate:fresh --seed` 会跑完全部迁移(含将 Registry 写回库的 resync 类迁移)与 `DatabaseSeeder`;**仅修改** `AdminAuthorizationRegistry.php` 时,在已有库上执行 `lottery:admin-auth-sync --audit`,不要依赖单独补丁 migration。 + +## 仪表盘 API 与子块权限 + +- `GET /api/v1/admin/dashboard` 与 `…/analytics`:中间件要求 `dashboard.view`(对应产品权限 `prd.dashboard.view`)。 +- 进入仪表盘后,财务/期号/风控、钱包异常计数等子块仍按 `AdminDashboardSnapshotBuilder` 内各 `prd.*` 细分(与侧栏其它模块权限一致)。 + ## 已废弃的 `prd.*`(请求体仍可传入,会自动归一) | 旧 slug | 归一为 |