今天我们分享的是一套由 东莞梦幻网络科技 自研的体育直播源码,在 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 审计日志系统
日志记录维度:
关键实现:
// 数据库日志表结构
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)│
└───────────┘
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。