with one click
permissions-dev
系统权限开发流程规范。新增功能模块时必须遵循此流程注册权限项,确保权限控制完整覆盖。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
系统权限开发流程规范。新增功能模块时必须遵循此流程注册权限项,确保权限控制完整覆盖。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
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() 保护