com um clique
permissions-dev
系统权限开发流程规范。新增功能模块时必须遵循此流程注册权限项,确保权限控制完整覆盖。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
系统权限开发流程规范。新增功能模块时必须遵循此流程注册权限项,确保权限控制完整覆盖。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
StarRocks Manager 完整 UI 规范。任何涉及 UI 修改、新页面、新组件的工作必须参考此规范。
审计日志记录规范。所有变更类操作(API 增删改、后台任务执行)必须记录审计日志,确保操作可追溯。
数据库表结构变更管理流程(Flyway 模式)。当需要新增表、修改列、添加索引等数据库 schema 变更时,必须使用此 skill。
| name | permissions-dev |
| description | 系统权限开发流程规范。新增功能模块时必须遵循此流程注册权限项,确保权限控制完整覆盖。 |
适用范围: 任何涉及新增功能模块、菜单项、API 路由的开发工作
核心文件:
src/lib/permissions.ts— 权限常量定义 & 服务端检查src/lib/local-db.ts—sys_role_permissions表src/hooks/usePermissions.ts— 前端权限 hooksrc/components/Sidebar.tsx— 菜单权限控制src/app/(authenticated)/sys-permissions/page.tsx— 权限管理 UI
| 角色 | 说明 | 权限来源 |
|---|---|---|
admin | 管理员 | 代码级全权限,不受 DB 配置影响 |
editor | 编辑者 | DB 表 sys_role_permissions 配置 |
viewer | 只读者 | DB 表 sys_role_permissions 配置 |
每个权限项是一个字符串常量,定义在 PERMISSIONS 对象中:
// src/lib/permissions.ts
export const PERMISSIONS = {
DASHBOARD: 'dashboard',
DATABASES: 'databases',
// ... 每个功能模块一个权限项
} as const;
-- sys_role_permissions 表
-- role: 'editor' | 'viewer'
-- permission: 权限项字符串
-- granted: 1=允许, 0=禁止
CREATE TABLE sys_role_permissions (
role TEXT NOT NULL,
permission TEXT NOT NULL,
granted INTEGER NOT NULL DEFAULT 1,
PRIMARY KEY (role, permission)
);
每次新增一个功能模块(含页面 + API),必须按以下步骤注册权限:
在 src/lib/permissions.ts 的 PERMISSIONS 对象中新增常量:
export const PERMISSIONS = {
// ... 已有项
NEW_FEATURE: 'new_feature', // ← 新增
} as const;
同时在 PERMISSION_META 中添加元数据(用于管理 UI 显示):
export const PERMISSION_META: Record<string, { label: string; group: string; description: string }> = {
// ... 已有项
new_feature: {
label: '新功能',
group: '所属分组', // 对应 sidebar section 名
description: '新功能的描述',
},
};
在 DEFAULT_PERMISSIONS 中为 editor 和 viewer 配置默认值:
export const DEFAULT_PERMISSIONS: Record<string, Record<string, boolean>> = {
editor: {
// ... 已有项
new_feature: true, // ← editor 默认是否有权限
},
viewer: {
// ... 已有项
new_feature: false, // ← viewer 默认是否有权限
},
};
在 Sidebar.tsx 的 navItems 中使用 permission 字段:
const navItems: NavItem[] = [
// ...
{ href: '/new-feature', icon: SomeIcon, label: '新功能', permission: 'new_feature' },
];
在 API route 中使用 requirePermission:
import { requirePermission } from '@/lib/permissions';
export async function GET(request: NextRequest) {
const { user } = requirePermission(request, 'new_feature');
// ...
}
页面级别可通过 usePermissions hook 检查:
const { hasPermission } = usePermissions();
if (!hasPermission('new_feature')) {
return <AccessDenied />;
}
// 检查角色是否有指定权限(admin 始终返回 true)
hasPermission(role: SysRole, permission: string): boolean
// API 路由中间件:requireAuth + 权限检查
requirePermission(request: Request, permission: string): { user, session }
// 获取角色的所有权限
getPermissionsForRole(role: SysRole): string[]
// usePermissions hook
const { permissions, hasPermission, loading } = usePermissions();
// permissions: string[] — 当前用户拥有的权限列表
// hasPermission(p: string) — 检查是否有指定权限
// loading: boolean — 是否正在加载
路径:/sys-permissions
DEFAULT_PERMISSIONS 默认值PERMISSIONS 中注册了权限常量PERMISSION_META 中添加了标签、分组、描述DEFAULT_PERMISSIONS 设置了 editor/viewer 默认值navItems 使用 permission 字段requirePermission() 保护