开发体育直播系统后台权限设计实践分享|ThinkPHP 技术栈落地案例
今天我们分享的是一套由 东莞梦幻网络科技 自研的体育直播源码,在 ThinkPHP + MySQL 技术栈的加持下,后台权限系统如何从0到1落地,并支撑整个平台稳定运行。
一、整体架构设计
用户端(APP / H5 / PC)↓
前端接口层(RESTful API / WebSocket)↓
后台业务服务层(PHP + ThinkPHP)↓
权限控制中间层(RBAC 扩展模型)↓
MySQL 数据层 + Redis 缓存层
二、后端技术选型
技术 | 说明 |
---|---|
PHP | 主语言,负责服务端业务逻辑处理 |
ThinkPHP | MVC 框架,支持灵活的路由配置与中间件机制 |
MySQL | 核心数据库,存储用户数据、权限配置、日志信息等 |
Redis | 提升系统响应速度,用于缓存权限结构与临时数据 |
RBAC | 核心数据库,存储用户数据、权限配置、日志信息等 |
MySQL | 核心数据库,存储用户数据、权限配置、日志信息等 |
三、权限系统详细设计
3.1 RBAC增强模型
graph TDA[管理员] -->|属于| B[角色]B -->|包含| C[权限组]C -->|包含| D[权限节点]D -->|映射| E[控制器方法]F[菜单] -->|绑定| DG[操作日志] -->|记录| A
3.2 核心组件实现
3.2.1 权限节点自动化
// 在菜单配置中声明权限节点
'menu' => [['title' => '赛事管理','route' => 'match/index','auth_node' => ['match_add' => '添加赛事','match_del' => '删除赛事','match_sync' => '同步API' ]]
]// 自动注册到权限系统
class AuthService {public function syncNodes() {foreach(config('menu') as $menu){foreach($menu['auth_node'] as $node=>$name){NodeModel::firstOrCreate(['node' => $menu['route'].'@'.$node,'name' => $name]);}}}
}
3.2.2 动态角色绑定
// 角色权限模板配置
'role_templates' => ['content_admin' => ['match/*','anchor/audit','post/delete'],'shop_admin' => ['goods/*','order/*']
];// 角色创建时应用模板
$role->applyTemplate('content_admin');
3.2.3 权限中间件
class AuthMiddleware {public function handle($request, $next) {$node = $request->module().'/'.$request->controller().'@'.$request->action();if(!Auth::user()->can($node)){return response('无权操作', 403);}return $next($request);}
}
3.3 审计日志系统
日志记录维度:
- 操作人、IP、时间戳
- 操作类型(增删改查)
- 受影响数据(JSON Diff)
- 请求参数
关键实现:
// 数据库日志表结构
Schema::create('admin_logs', function (Blueprint $table) {$table->id();$table->integer('admin_id');$table->string('module', 30);$table->string('action', 50);$table->text('before_data')->nullable();$table->text('after_data')->nullable();$table->string('ip', 45);$table->timestamps();
});// 行为监听
Event::listen('admin.operate', function($admin, $action, $data){AdminLog::create(['admin_id' => $admin->id,'module' => request()->module(),'action' => $action,'before_data' => json_encode($data['before']),'after_data' => json_encode($data['after']),'ip' => request()->ip()]);
});
四、模块化权限控制
4.1 功能模块权限矩阵
模块名称 | 权限节点 | 控制粒度 |
---|---|---|
赛事管理 | match/add, match/delete, match/sync_api | 路由级别 |
主播管理 | anchor/audit, anchor/ban, anchor/edit | 方法级别 |
社区管理 | post/delete, comment/ban, topic/set_top | 业务对象级 |
商城系统 | goods/add, stock/update, order/export | 数据范围级 |
专家预测 | expert/verify, predict/recommend | 状态机控制 |
竞猜活动 | quiz/create, quiz/publish, point/distribute | 时间窗口控制 |
4.2 典型权限配置示例
# 权限组配置
- group: 内容管理nodes:- match/add- match/delete- anchor/audit- post/deletemenus:- 赛事管理- 主播审核- 社区管理
五、关键技术实现
5.1 权限缓存优化
// 用户权限缓存结构
$userPermissions = Redis::hGetAll("user:{$uid}:permissions");// 权限检查优化
function checkPermission($node) {static $cache = [];if(!isset($cache[$node])){$cache[$node] = in_array($node, Redis::hGetAll("user:{$uid}:permissions"));}return $cache[$node];
}
5.2 数据权限控制
// 数据范围限制
class MatchController {public function index() {$query = Match::query();// 添加数据范围过滤if(!Auth::user()->can('match/all')){$query->whereIn('id', Auth::user()->getDataScope('match'));}return $query->paginate();}
}
六、部署架构
┌───────────────┐│ CDN/OSS │└──────┬───────┘│┌─────────────▼─────────────┐│ API Gateway ││ (Nginx + Load Balancer) │└───────┬─────────┬─────────┘│ │┌─────────▼─┐ ┌───▼─────────┐│ Web1 │ │ Web2 ││(PHP-FPM) │ │(PHP-FPM) │└────┬──────┘ └────┬───────┘│ │┌─────▼──────────────▼─────┐│ MySQL Cluster ││ (Master-Slave + MHA) │└──────────┬──────────────┘│┌─────▼─────┐│ Redis ││ (Cluster)│└───────────┘
七、安全设计
- 权限最小化原则:所有新功能默认无权限
- 操作二次验证:敏感操作需短信/邮箱确认
- 权限变更追溯:权限修改记录永久保存
- 定期权限审计:每月自动扫描异常权限
八、性能优化
- 权限缓存:用户权限树Redis缓存,TTL 1小时
- 节点懒加载:非核心权限动态加载
- 批量检查优化:使用bitmap压缩权限标识
- 日志分片存储:按月份分表存储操作日志