交易所管理后台 - 菜单、接口、角色和用户权限配置文档
目录
系统架构概述
技术栈
- 前端框架: Vue.js 2.x + Element UI
- 状态管理: Vuex
- 路由管理: Vue Router
- 权限控制: 基于角色的权限控制 (RBAC)
- 国际化: Vue i18n (支持简体中文、繁体中文、英文)
核心目录结构
src/
├── api/ # API接口管理
│ └── admin/
│ ├── sys-menu.js # 菜单管理API
│ ├── sys-role.js # 角色管理API
│ ├── sys-user.js # 用户管理API
│ └── sys-api.js # 接口管理API
├── directive/ # 自定义指令
│ └── permission/ # 权限指令
│ ├── permisaction.js # 权限控制指令
│ └── permission.js # 路由权限
├── store/ # 状态管理
│ └── modules/
│ ├── permission.js # 权限状态管理
│ └── user.js # 用户状态管理
├── views/ # 页面组件
│ └── admin/ # 管理员相关页面
│ ├── sys-menu/ # 菜单管理
│ ├── sys-role/ # 角色管理
│ ├── sys-user/ # 用户管理
│ └── admin-rights/ # 权限管理
└── i18n/ # 国际化配置
└── locales/
├── zh-CN/ # 简体中文
├── zh-TW/ # 繁体中文
└── en-US/ # 英文1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
菜单配置详解
菜单数据结构
菜单系统采用树形结构,支持多级嵌套:
javascript
{
menuId: 1, // 菜单ID
title: "系统管理", // 菜单标题
menuName: "SystemManagement", // 菜单名称(用于国际化)
parentId: 0, // 父菜单ID (0为根菜单)
path: "/admin", // 路由路径
component: "Layout", // 组件路径
menuType: "M", // 菜单类型: M-目录 C-菜单 F-按钮
visible: "0", // 是否显示: 0-显示 1-隐藏
icon: "system", // 菜单图标
sort: 1, // 排序号
permission: "admin:system", // 权限标识
isFrame: "1", // 是否外链: 0-是 1-否
noCache: false, // 是否缓存
children: [] // 子菜单列表
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
菜单类型说明
1. 目录 (M - Menu Directory)
- 用于组织菜单结构的容器
- 通常不对应具体页面
- component 设置为 "Layout"
- 示例:系统管理、用户管理、资产管理
2. 菜单 (C - Component)
- 对应具体的页面组件
- component 设置为具体的 Vue 组件路径
- 示例:用户列表、角色管理、菜单管理
3. 按钮 (F - Function)
- 页面内的功能按钮
- 用于控制页面内操作权限
- 不显示在侧边栏
- 示例:新增按钮、编辑按钮、删除按钮
主要功能模块菜单
系统管理 (SystemManagement)
系统管理/
├── 用户管理 (UserAdmin)
├── 角色管理 (RoleManagement)
├── 菜单管理 (SysMenuManage)
├── 部门管理 (SysDeptManage)
├── 接口管理 (InterfaceManagement)
├── 字典管理 (SysDictDataManage)
└── 日志管理 (Log)
├── 操作日志 (OperLog)
└── 登录日志 (SysLoginLogManage)1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
用户管理 (ExchangeUser)
用户管理/
├── 用户列表 (UserList)
├── 用户信息 (UserInfo)
├── KYC管理 (Kyc)
│ ├── KYC列表 (KycListPage)
│ └── KYC详情 (KycDetailPage)
├── 邀请码管理 (InvitationCode)
└── 白名单认证 (WhiteListing)1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
资产管理 (AssetManagement)
资产管理/
├── 地址管理 (AddressManage)
├── 法币充值 (BankDeposit)
├── 法币提现 (BankWithdrawal)
├── 数字币充值 (CryptoDeposit)
├── 数字币提现 (CryptoWithdrawal)
├── 法币汇兑 (FiatSwap)
└── 交易管理 (RelatedSet)1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
财务管理 (FinancialManagement)
财务管理/
├── 财务报表 (FinancialReport)
├── 利润结算 (ProfitSettlement)
├── 供应商结算 (SupplierSettlement)
└── 钱包余额快照 (WalletBalanceSnapshot)1
2
3
4
5
2
3
4
5
运营管理 (OperationPage)
运营管理/
├── 现货订单 (SportOrder)
├── OTC管理 (OTCManagement)
├── VATP报表 (VATP)
└── 内容通知 (ContentNotice)1
2
3
4
5
2
3
4
5
风控设置 (RiskControlSettings)
风控设置/
├── 热钱包占比监控 (HotWalletShareMonitoring)
├── 持仓限制监测 (PositionLimitMonitoring)
├── 做市商监测 (MarketMaker)
├── 账户反洗钱监测 (AccountAntiMoney)
└── 每日持仓快照 (PositionSnapshot)1
2
3
4
5
6
2
3
4
5
6
权限系统设计
权限模型与ER关系图
系统采用 RBAC (Role-Based Access Control) 模型,核心思想是通过角色作为用户和权限的桥梁,实现灵活的权限管理。以下是系统的实体关系图:
权限控制核心流程
权限绑定流程
- 接口绑定到菜单: 每个菜单项可以绑定多个API接口,控制该菜单对应功能的后端权限
- 菜单权限分配给角色: 通过角色管理为特定角色分配菜单访问权限
- 角色分配给用户: 在用户管理中为用户分配角色
- 权限继承: 用户通过角色继承获得菜单和API访问权限
权限验证链路
用户登录 → 加载角色菜单权限 → 生成动态路由 → 控制页面访问 → 验证API权限1
权限层级
1. 菜单权限
- 模块级权限: 控制整个功能模块的访问
- 页面级权限: 控制具体页面的访问
- 操作级权限: 控制页面内按钮和操作的显示
2. API权限
- 接口访问权限: 控制对特定API接口的访问
- 操作权限: 如增删改查等具体操作
权限标识命名规范
格式规范
模块:资源:操作1
示例
javascript
// 系统管理相关权限
"admin:sysUser:add" // 新增用户
"admin:sysUser:edit" // 编辑用户
"admin:sysUser:remove" // 删除用户
"admin:sysUser:query" // 查询用户
"admin:sysRole:add" // 新增角色
"admin:sysRole:update" // 修改角色
"admin:sysRole:remove" // 删除角色
"admin:sysRole:query" // 查询角色
"admin:sysMenu:add" // 新增菜单
"admin:sysMenu:edit" // 编辑菜单
"admin:sysMenu:remove" // 删除菜单
"admin:sysMenu:query" // 查询菜单
// 业务相关权限
"kyc:info:update" // KYC信息更新
"kyc:info:approve" // KYC审核通过
"kyc:info:reject" // KYC审核拒绝
"kyc:list:download" // KYC列表下载
"bank:deposit:examine" // 法币充值审核
"bank:withdrawal:payment" // 法币提现支付
"crypto:deposit:examine" // 数字币充值审核
"crypto:withdrawal:examine" // 数字币提现审核
"whitelist:info:approve" // 白名单审核通过
"whitelist:info:reject" // 白名单审核拒绝1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
角色管理机制
角色数据结构
javascript
{
roleId: 1, // 角色ID
roleName: "系统管理员", // 角色名称
roleKey: "admin", // 角色权限字符
sort: 1, // 显示顺序
status: "0", // 角色状态: 0-正常 1-停用
dataScope: "1", // 数据权限范围
menuIds: [1, 2, 3], // 关联菜单ID列表
deptIds: [100, 101], // 关联部门ID列表(用于数据权限)
remark: "系统管理员", // 备注
createdAt: "2023-01-01", // 创建时间
updatedAt: "2023-01-01" // 更新时间
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
预置角色类型
1. 超级管理员 (Super Admin)
- 角色权限字符:
admin - 权限范围: 所有权限
- 数据权限: 全部数据权限
- 说明: 系统最高权限,不可删除
2. 系统管理员 (System Admin)
- 权限范围: 系统管理相关功能
- 主要权限:
- 用户管理
- 角色管理
- 菜单管理
- 系统配置
3. 运营管理员 (Operation Admin)
- 权限范围: 业务运营相关功能
- 主要权限:
- 用户管理
- KYC审核
- 订单管理
- 客服管理
4. 财务管理员 (Finance Admin)
- 权限范围: 财务相关功能
- 主要权限:
- 充提管理
- 财务报表
- 资产管理
- 结算管理
5. 风控管理员 (Risk Admin)
- 权限范围: 风险控制相关功能
- 主要权限:
- 风控设置
- 监控管理
- 异常处理
- 反洗钱
6. 审核员 (Auditor)
- 权限范围: 审核相关功能
- 主要权限:
- KYC审核
- 充提审核
- 白名单审核
- 地址审核
角色权限分配原理
菜单权限分配
javascript
// 通过菜单树选择器分配权限
roleMenuTreeselect(roleId).then(response => {
// 获取角色已有的菜单权限
const menuIds = response.data.menuIds;
// 在菜单树中设置选中状态
this.$refs.menuTree.setCheckedKeys(menuIds);
});1
2
3
4
5
6
7
2
3
4
5
6
7
数据权限分配
javascript
// 数据权限类型
const dataScopeOptions = [
{ value: '1', label: '全部数据权限' },
{ value: '2', label: '自定数据权限' },
{ value: '3', label: '本部门数据权限' },
{ value: '4', label: '本部门及以下数据权限' },
{ value: '5', label: '仅本人数据权限' }
];1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
用户权限分配
用户数据结构
javascript
{
userId: 1, // 用户ID
username: "admin", // 用户名
nickName: "管理员", // 昵称
email: "admin@example.com", // 邮箱
phone: "13800000000", // 手机号
sex: "0", // 性别: 0-男 1-女 2-未知
avatar: "", // 头像
status: "0", // 用户状态: 0-正常 1-停用 2-删除
deptId: 100, // 所属部门ID
postIds: [1, 2], // 岗位ID列表
roleIds: [1, 2], // 角色ID列表
remark: "备注信息", // 备注
createdAt: "2023-01-01", // 创建时间
updatedAt: "2023-01-01" // 更新时间
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
权限继承机制
1. 角色继承
- 用户通过角色获得权限
用户状态管理
用户状态类型
- 正常 (0): 用户可正常使用系统
- 停用 (1): 用户被暂时停用,无法登录
- 删除 (2): 用户被删除,无法恢复
权限冻结
系统支持细粒度的权限冻结:
javascript
// 冻结用户登录权限
frozenUserLogin(userId)
// 冻结用户充值权限
frozenUserDeposit(userId)
// 冻结用户提现权限
frozenUserWithdraw(userId)1
2
3
4
5
6
2
3
4
5
6
API接口权限
接口权限数据结构
javascript
{
id: 1, // 接口ID
title: "用户管理接口", // 接口标题
path: "/api/v1/user", // 接口路径
action: "GET", // 请求方法
type: "SYS", // 接口类型: SYS-系统 BIZ-业务
description: "用户管理相关接口", // 接口描述
status: "1", // 状态: 0-停用 1-启用
createdAt: "2023-01-01", // 创建时间
updatedAt: "2023-01-01" // 更新时间
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
接口分类
1. 系统接口 (SYS)
用于系统管理和配置的接口:
javascript
// 用户管理接口
GET /api/v1/user // 查询用户列表
POST /api/v1/user // 新增用户
PUT /api/v1/user/{id} // 修改用户
DELETE /api/v1/user // 删除用户
// 角色管理接口
GET /api/v1/role // 查询角色列表
POST /api/v1/role // 新增角色
PUT /api/v1/role/{id} // 修改角色
DELETE /api/v1/role // 删除角色
// 菜单管理接口
GET /api/v1/menu // 查询菜单列表
POST /api/v1/menu // 新增菜单
PUT /api/v1/menu/{id} // 修改菜单
DELETE /api/v1/menu // 删除菜单1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2. 业务接口 (BIZ)
用于业务功能的接口:
javascript
// KYC管理接口
GET /api/v1/kyc/list // KYC列表查询
POST /api/v1/kyc/audit // KYC审核
GET /api/v1/kyc/{id} // KYC详情查询
// 充提管理接口
GET /api/v1/deposit // 充值记录查询
POST /api/v1/deposit/audit // 充值审核
GET /api/v1/withdraw // 提现记录查询
POST /api/v1/withdraw/audit // 提现审核
// 订单管理接口
GET /api/v1/order // 订单列表查询
POST /api/v1/order/cancel // 订单取消
GET /api/v1/order/{id} // 订单详情查询1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
接口权限绑定
菜单接口绑定
每个菜单可以绑定多个API接口:
javascript
// 菜单配置中的API权限
{
menuId: 1,
title: "用户管理",
permission: "admin:sysUser",
apis: [
{
id: 1,
title: "查询用户接口",
path: "/api/v1/user",
action: "GET"
},
{
id: 2,
title: "新增用户接口",
path: "/api/v1/user",
action: "POST"
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
权限验证流程
- 前端权限验证: 基于用户角色和权限标识
- 后端接口验证: 基于JWT Token和权限表
- 数据权限过滤: 根据用户数据权限范围过滤数据
权限配置完整流程说明
权限配置总体流程图
权限配置三个核心环节
1. 接口-菜单绑定环节
- 在菜单管理中,为每个菜单项配置对应的API接口
- 确保前端菜单操作有对应的后端API权限支撑
- 按钮级权限通过绑定特定的操作接口实现
2. 角色-菜单权限分配环节
- 在角色管理中,通过菜单权限树为角色分配可访问的菜单
- 设置角色的数据权限范围(全部/自定义/部门级)
- 角色作为权限的载体,是权限管理的核心
3. 用户-角色分配环节
- 在用户管理中,为用户分配角色
- 支持临时权限调整和权限冻结
新增角色配置流程
1. 创建角色
javascript
// 1. 进入角色管理页面
// 路径: /admin/sys-role
// 2. 点击新增按钮
// 权限要求: admin:sysRole:add
// 3. 填写角色信息
const roleData = {
roleName: "新角色名称",
roleKey: "new_role",
sort: 1,
status: "0",
remark: "角色说明"
};
// 4. 提交创建
addRole(roleData);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2. 分配菜单权限
javascript
// 1. 编辑创建的角色
// 2. 在菜单权限树中选择权限
// 3. 保存权限配置
const menuIds = this.getMenuAllCheckedKeys();
updateRole({
roleId: roleId,
menuIds: menuIds
});1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 分配数据权限
javascript
// 1. 设置数据权限范围
// 2. 如果选择自定义数据权限,选择部门
const dataScopeData = {
roleId: roleId,
dataScope: "2", // 自定义数据权限
deptIds: [100, 101] // 选择的部门
};
dataScope(dataScopeData);1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
新增用户配置流程
1. 创建用户
javascript
// 1. 进入用户管理页面
// 路径: /admin/sys-user
// 2. 点击新增按钮
// 权限要求: admin:sysUser:add
// 3. 填写用户信息
const userData = {
username: "newuser",
nickName: "新用户",
email: "newuser@example.com",
phone: "13800000000",
sex: "0",
status: "0",
deptId: 100,
postIds: [1],
roleIds: [2, 3] // 分配角色
};
// 4. 提交创建
addUser(userData);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2. 分配角色
用户创建时或创建后可以分配角色:
- 通过角色选择器选择多个角色
- 用户权限为所有角色权限的并集
新增菜单配置流程
1. 创建菜单
javascript
// 1. 进入菜单管理页面
// 路径: /admin/sys-menu
// 2. 点击新增按钮
// 权限要求: admin:sysMenu:add
// 3. 填写菜单信息
const menuData = {
title: "新菜单",
menuName: "NewMenu",
parentId: 0, // 父菜单ID
path: "/new-menu",
component: "/admin/new-menu/index",
menuType: "C", // 菜单类型
visible: "0",
icon: "menu",
sort: 1,
permission: "admin:newMenu:query",
isFrame: "1"
};
// 4. 提交创建
addMenu(menuData);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2. 配置API权限
javascript
// 1. 编辑菜单,配置API权限
// 2. 在接口权限配置中选择相关API
const apis = [
{ id: 1, title: "查询接口", path: "/api/v1/new-resource", action: "GET" },
{ id: 2, title: "新增接口", path: "/api/v1/new-resource", action: "POST" }
];
updateMenu({
menuId: menuId,
apis: apis
});1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
权限调试和验证
1. 前端权限验证
vue
<!-- 使用权限指令控制按钮显示 -->
<el-button
v-permisaction="['admin:sysUser:add']"
type="primary"
@click="handleAdd">
新增用户
</el-button>1
2
3
4
5
6
7
2
3
4
5
6
7
2. 路由权限验证
javascript
// 在路由守卫中验证权限
router.beforeEach(async (to, from, next) => {
// 验证用户是否登录
const hasToken = getToken();
if (hasToken) {
// 获取用户权限
const { roles } = await store.dispatch('user/getInfo');
// 生成可访问路由
const accessRoutes = await store.dispatch('permission/generateRoutes', roles);
// 动态添加路由
router.addRoutes(accessRoutes);
next({ ...to, replace: true });
} else {
next('/login');
}
});1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
国际化支持
菜单名称国际化
配置文件结构
src/i18n/locales/
├── zh-CN/
│ ├── menu.json # 菜单名称
│ ├── admin.json # 管理功能
│ └── components.json # 组件文本
├── zh-TW/
│ ├── menu.json
│ ├── admin.json
│ └── components.json
└── en-US/
├── menu.json
├── admin.json
└── components.json1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
菜单名称映射示例
json
// zh-CN/menu.json
{
"SystemManagement": "系统管理",
"UserAdmin": "用户管理",
"RoleManagement": "角色管理",
"SysMenuManage": "菜单管理",
"admin:sysUser:add": "新增用户",
"admin:sysUser:edit": "修改用户",
"admin:sysUser:remove": "删除用户"
}
// en-US/menu.json
{
"SystemManagement": "System Management",
"UserAdmin": "User Management",
"RoleManagement": "Role Management",
"SysMenuManage": "Menu Management",
"admin:sysUser:add": "Add User",
"admin:sysUser:edit": "Edit User",
"admin:sysUser:remove": "Delete User"
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
国际化使用方式
vue
<template>
<span v-if="scope.row?.menuName && $t(`menu['${scope.row?.menuName}']`)!==`menu['${scope.row?.menuName}']`">
{{ $t(`menu['${scope.row?.menuName}']`) }}
</span>
<span v-else>
{{ scope.row.title }}
</span>
</template>1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
权限控制实现
权限指令实现
v-permisaction 指令
javascript
// src/directive/permission/permisaction.js
export default {
inserted(el, binding, vnode) {
const { value } = binding;
const all_permission = '*:*:*';
const permissions = store.getters && store.getters.permisaction;
if (value && value instanceof Array && value.length > 0) {
const permissionFlag = value;
const hasPermissions = permissions.some(permission => {
return all_permission === permission || permissionFlag.includes(permission);
});
if (!hasPermissions) {
el.parentNode && el.parentNode.removeChild(el);
}
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用示例
vue
<template>
<!-- 系统管理相关权限 -->
<el-button v-permisaction="['admin:sysUser:add']">新增用户</el-button>
<el-button v-permisaction="['admin:sysUser:edit']">编辑用户</el-button>
<el-button v-permisaction="['admin:sysUser:remove']">删除用户</el-button>
<!-- 业务相关权限 -->
<el-button v-permisaction="['kyc:info:approve']">KYC审核通过</el-button>
<el-button v-permisaction="['kyc:info:reject']">KYC审核拒绝</el-button>
<!-- 多权限验证(满足其一即可) -->
<el-button v-permisaction="['admin:sysUser:edit', 'admin:sysUser:query']">查看用户</el-button>
</template>1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
动态路由生成
路由权限过滤
javascript
// src/store/modules/permission.js
export function generaMenu(routes, data) {
data.forEach((item) => {
const menu = {
path: item.path,
component: item.component === 'Layout' ? Layout : loadView(item.component),
hidden: item.visible !== '0',
children: [],
name: item.menuName,
meta: {
title: item.title,
menuName: item.menuName,
icon: item.icon,
noCache: item.noCache
}
};
if (item.children) {
generaMenu(menu.children, item.children);
}
routes.push(menu);
});
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
权限路由生成流程
- 用户登录后获取菜单权限数据
- 将菜单数据转换为Vue Router路由配置
- 动态添加路由到路由器
- 更新侧边栏菜单显示
数据权限过滤
数据权限类型处理
javascript
// 根据用户数据权限范围过滤数据
const filterDataByPermission = (data, userInfo) => {
const { dataScope, deptId, deptIds } = userInfo;
switch(dataScope) {
case '1': // 全部数据权限
return data;
case '2': // 自定数据权限
return data.filter(item => deptIds.includes(item.deptId));
case '3': // 本部门数据权限
return data.filter(item => item.deptId === deptId);
case '4': // 本部门及以下数据权限
return data.filter(item =>
item.deptId === deptId ||
isSubDept(item.deptId, deptId)
);
case '5': // 仅本人数据权限
return data.filter(item => item.userId === userInfo.userId);
default:
return [];
}
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
权限配置最佳实践
1. 权限设计核心原则
最小权限原则 (Principle of Least Privilege)
- 定义: 用户只获得完成工作所需的最小权限,避免权限滥用
- 实施:
- 新用户默认无权限,按需申请
- 定期检查并回收不必要的权限
- 临时权限设置有效期,到期自动回收
职责分离原则 (Separation of Duties)
- 定义: 不同角色负责不同的业务领域,避免权限集中
- 实施:
- 财务审核与操作分离
- 业务操作与系统管理分离
- 数据查看与数据修改分离
权限继承与委托
- 角色继承: 通过角色层级实现权限继承
- 部门权限: 基于组织架构的权限传递
- 临时委托: 支持权限的临时转移
审计追踪原则
- 全程记录: 记录所有权限变更操作
- 操作留痕: 敏感操作需要审批流程
- 定期审计: 建立权限审计机制
2. 角色设计最佳实践
按业务模块垂直划分
系统管理域 --> 系统管理员角色
用户管理域 --> 用户管理员角色
财务管理域 --> 财务管理员角色
风控管理域 --> 风控管理员角色1
2
3
4
2
3
4
按权限级别水平划分
超级管理员 --> 全系统权限
高级管理员 --> 多模块权限
普通管理员 --> 单模块权限
审核员 --> 审核操作权限
查看员 --> 只读查看权限1
2
3
4
5
2
3
4
5
角色组合策略
- 基础角色: 提供基本的查看权限
- 功能角色: 提供特定功能的操作权限
- 管理角色: 提供管理和配置权限
- 用户角色 = 基础角色 + 功能角色 + 管理角色
3. 权限配置安全策略
多层防护机制
敏感操作保护
- 双重验证: 敏感操作需要二次确认
- 审批流程: 重要权限变更需要审批
- 时间窗口: 敏感操作设置时间限制
- IP白名单: 限制管理操作的来源IP
权限异常监控
- 异常登录检测: 监控异常时间、地点的登录
- 权限滥用检测: 监控超出正常范围的操作
- 批量操作预警: 大批量数据操作需要预警
- 权限变更通知: 权限变更实时通知相关人员
4. 系统性能优化策略
权限数据缓存
javascript
// 用户权限信息缓存策略
const cacheStrategy = {
userPermissions: '30分钟', // 用户权限缓存
roleMenus: '1小时', // 角色菜单缓存
menuTree: '24小时', // 菜单树缓存
apiPermissions: '1小时' // API权限缓存
};1
2
3
4
5
6
7
2
3
4
5
6
7
权限查询优化
- 索引优化: 为权限查询字段建立复合索引
- 分页加载: 大量数据采用分页或虚拟滚动
- 并发控制: 限制并发权限查询请求数量
- 批量处理: 权限分配支持批量操作
前端渲染优化
- 菜单懒加载: 按需加载菜单组件
- 权限预计算: 登录时预计算用户权限
- 组件缓存: 缓存权限相关的Vue组件
- 虚拟滚动: 大量权限列表使用虚拟滚动
5. 权限管理运维规范
权限生命周期管理
定期审计制度
- 月度审计: 检查用户权限变更情况
- 季度审计: 全面审计角色权限配置
- 年度审计: 权限体系整体评估和优化
- 突发审计: 安全事件后的紧急权限审计
权限变更流程
- 申请阶段: 明确权限需求和使用期限
- 审批阶段: 上级主管和系统管理员双重审批
- 配置阶段: 专业人员进行权限配置
- 验证阶段: 验证权限配置的正确性
- 记录阶段: 记录权限变更的详细信息
常见问题和解决方案
1. 权限不生效
问题: 配置了权限但前端仍然显示按钮 解决:
- 检查权限标识是否正确
- 确认用户角色是否包含该权限
- 清除浏览器缓存重新登录
2. 菜单不显示
问题: 配置了菜单但侧边栏不显示 解决:
- 检查菜单的visible字段是否为"0"
- 确认用户角色是否有该菜单权限
- 检查菜单的父子关系是否正确
3. 国际化不生效
问题: 菜单名称不显示对应语言 解决:
- 检查国际化配置文件是否包含对应key
- 确认menuName字段是否正确设置
- 检查语言切换是否生效
4. 数据权限异常
问题: 用户看到不应该看到的数据 解决:
- 检查用户的数据权限范围设置
- 确认部门权限配置是否正确
- 检查后端数据过滤逻辑
总结与展望
系统优势总结
本交易所管理后台权限系统是一套完整、成熟的企业级权限管理解决方案,具有以下核心优势:
1. 架构设计优势
- 标准RBAC模型: 采用业界标准的角色访问控制模型,架构清晰、易于理解
- 多层权限控制: 覆盖菜单权限、数据权限、API权限的完整权限体系
- 实体关系清晰: 通过ER图展现的数据模型关系明确,便于维护和扩展
2. 功能完整性优势
- 全生命周期管理: 从权限创建到回收的完整生命周期管理
- 细粒度控制: 支持到按钮级别的精细权限控制
- 灵活权限分配: 支持多角色分配和权限继承机制
- 动态权限加载: 基于用户角色动态生成菜单和路由
3. 技术实现优势
- 前后端分离: 前端权限控制与后端API验证双重保障
- 国际化支持: 完整的多语言支持体系
- 性能优化: 权限缓存、懒加载等多种性能优化策略
- 安全防护: 多层安全防护机制,确保系统安全
4. 运维管理优势
- 可视化配置: 通过友好的界面进行权限配置和管理
- 审计追踪: 完整的操作日志和权限变更记录
- 异常监控: 权限异常的实时监控和预警机制
- 规范化流程: 标准化的权限申请、审批、分配流程
应用场景适配
该权限系统特别适合以下应用场景:
金融交易平台
- 多角色协作: 支持交易员、风控、财务、审计等多角色协作
- 严格权限控制: 满足金融行业对权限管控的严格要求
- 合规性要求: 完整的审计日志满足监管合规要求
企业管理系统
- 组织架构映射: 支持复杂的企业组织架构权限映射
- 业务流程整合: 可与企业业务流程深度整合
- 扩展性良好: 模块化设计便于功能扩展
SaaS多租户平台
- 租户隔离: 支持多租户数据权限隔离
- 自定义配置: 租户可自定义权限配置
- 统一管理: 平台方可统一管理所有租户权限
持续改进方向
技术演进方向
- 微服务架构适配: 支持微服务架构下的分布式权限管理
- AI智能推荐: 基于用户行为的智能权限推荐
- 零信任安全: 引入零信任安全模型,加强权限验证
- 区块链审计: 利用区块链技术确保审计日志不可篡改
功能增强方向
- 工作流集成: 与审批工作流深度集成
- 移动端支持: 完善移动端权限管理功能
- 实时权限同步: 支持权限变更的实时同步
- 权限模板: 提供常用权限配置模板
管理优化方向
- 自动化运维: 权限配置的自动化和智能化
- 风险评估: 权限风险的自动评估和预警
- 合规检查: 自动化的权限合规性检查
- 性能监控: 权限系统性能的实时监控
最佳实践建议
实施建议
- 分步实施: 建议按模块逐步实施,降低实施风险
- 充分测试: 在生产环境上线前进行充分的权限测试
- 用户培训: 对管理员和最终用户进行系统培训
- 文档完善: 建立完善的权限配置和使用文档
维护建议
- 定期审计: 建立定期的权限审计制度
- 持续优化: 根据业务发展持续优化权限配置
- 安全加固: 定期进行安全风险评估和加固
- 版本管理: 建立权限配置的版本管理机制
通过本权限系统的实施和不断优化,能够为交易所的安全运营提供坚实的权限管理基础,确保业务的合规性、安全性和高效性。
