今天我们分享的是一套由 东莞梦幻网络科技 自研的体育直播源码,在 ThinkPHP + MySQL 技术栈的加持下,后台权限系统如何从0到1落地,并支撑整个平台稳定运行。

一、整体架构设计

用户端(APP / H5 / PC)
   ↓
前端接口层(RESTful API / WebSocket)
   ↓
后台业务服务层(PHP + ThinkPHP)
   ↓
权限控制中间层(RBAC 扩展模型)
   ↓
MySQL 数据层 + Redis 缓存层

二、后端技术选型

技术说明
PHP主语言,负责服务端业务逻辑处理
ThinkPHPMVC 框架,支持灵活的路由配置与中间件机制
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)│
               └───────────┘

七、安全设计

  1. 权限最小化原则:所有新功能默认无权限
  2. 操作二次验证:敏感操作需短信/邮箱确认
  3. 权限变更追溯:权限修改记录永久保存
  4. 定期权限审计:每月自动扫描异常权限

八、性能优化

  1. 权限缓存:用户权限树Redis缓存,TTL 1小时
  2. 节点懒加载:非核心权限动态加载
  3. 批量检查优化:使用bitmap压缩权限标识
  4. 日志分片存储:按月份分表存储操作日志

东莞梦幻网络科技
1 声望0 粉丝