今天我们分享的是一套由 东莞梦幻网络科技 自研的体育直播源码,在 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 TD
A[管理员] -->|属于| B[角色]
B -->|包含| C[权限组]
C -->|包含| D[权限节点]
D -->|映射| E[控制器方法]
F[菜单] -->|绑定| D
G[操作日志] -->|记录| 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/delete
menus:
- 赛事管理
- 主播审核
- 社区管理
五、关键技术实现
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压缩权限标识
- 日志分片存储:按月份分表存储操作日志
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。