前言
在企业级应用开发中,权限管理是不可或缺的核心模块。本文将基于ThinkPHP 6.0的多应用模式,详细讲解如何构建一个完整的RBAC(基于角色的访问控制)权限管理系统。通过本教程,您将掌握多应用架构设计、中间件权限验证、数据库关系建模等关键技术。
一、项目架构设计
1.1 多应用目录结构
app
├── admin // 后台管理应用
│ ├── controller
│ ├── model
│ └── view
├── api // API接口应用
│ ├── controller
│ └── middleware
└── common // 公共模块
├── library
└── trait
1.2 数据库设计
核心数据表结构:
- admin_user – 管理员表(id, username, password, role_id, status)
- admin_role – 角色表(id, role_name, permissions, description)
- admin_permission – 权限节点表(id, name, route, module, status)
- admin_log – 操作日志表(id, user_id, action, ip, create_time)
二、核心功能实现
2.1 权限验证中间件
创建权限验证中间件,实现自动权限检测:
namespace appadminmiddleware;
class Auth
{
public function handle($request, Closure $next)
{
// 检查登录状态
if (!session('admin_user')) {
return redirect('/admin/login');
}
// 获取当前访问路径
$currentRoute = $request->controller() . '/' . $request->action();
// 超级管理员跳过权限验证
if (session('admin_user.role_id') == 1) {
return $next($request);
}
// 权限验证
if (!$this->checkPermission($currentRoute)) {
return json(['code' => 403, 'msg' => '无权限访问']);
}
return $next($request);
}
private function checkPermission($route)
{
$userPermissions = session('admin_user.permissions');
return in_array($route, $userPermissions);
}
}
2.2 角色权限管理
实现角色权限的分配和更新:
namespace appadmincontroller;
class Role extends Base
{
public function assignPermission()
{
if ($this->request->isPost()) {
$roleId = $this->request->post('role_id');
$permissions = $this->request->post('permissions/a');
// 更新角色权限
$role = appadminmodelRole::find($roleId);
$role->permissions = json_encode($permissions);
if ($role->save()) {
// 清除相关用户的权限缓存
$this->clearUserPermissionCache($roleId);
return json(['code' => 200, 'msg' => '权限分配成功']);
}
return json(['code' => 500, 'msg' => '权限分配失败']);
}
}
private function clearUserPermissionCache($roleId)
{
// 清除拥有该角色的用户的权限session
$users = appadminmodelAdminUser::where('role_id', $roleId)->select();
foreach ($users as $user) {
session('admin_user_' . $user->id, null);
}
}
}
三、高级特性实现
3.1 动态菜单生成
基于用户权限动态生成侧边栏菜单:
namespace appadmincontroller;
class Index extends Base
{
public function index()
{
// 获取用户有权限的菜单
$menus = $this->getUserMenus();
$this->assign('menus', $menus);
return $this->fetch();
}
private function getUserMenus()
{
$userPermissions = session('admin_user.permissions');
$allMenus = appadminmodelPermission::where('type', 1)
->order('sort', 'desc')
->select()
->toArray();
return $this->buildMenuTree($allMenus, $userPermissions);
}
private function buildMenuTree($menus, $permissions, $pid = 0)
{
$tree = [];
foreach ($menus as $menu) {
if ($menu['pid'] == $pid && in_array($menu['route'], $permissions)) {
$menu['children'] = $this->buildMenuTree($menus, $permissions, $menu['id']);
$tree[] = $menu;
}
}
return $tree;
}
}
3.2 操作日志记录
使用行为扩展记录用户操作日志:
namespace appadminbehavior;
class LogRecord
{
public function run($params)
{
$data = [
'user_id' => session('admin_user.id'),
'username' => session('admin_user.username'),
'action' => $params['action'],
'ip' => request()->ip(),
'user_agent' => request()->server('HTTP_USER_AGENT'),
'create_time' => time()
];
appadminmodelLog::create($data);
}
}
// 在控制器中使用
class User extends Base
{
protected $logActions = ['add', 'edit', 'delete'];
public function add()
{
// 记录添加操作
thinkfacadeHook::listen('admin_log', [
'action' => '添加用户'
]);
// 业务逻辑...
}
}
四、性能优化技巧
4.1 权限缓存策略
使用Redis缓存权限数据,提升系统性能:
namespace appcommonlibrary;
class PermissionCache
{
protected $redis;
protected $prefix = 'admin_permission:';
public function __construct()
{
$this->redis = thinkfacadeCache::store('redis')->handler();
}
public function getUserPermissions($userId)
{
$key = $this->prefix . $userId;
$permissions = $this->redis->get($key);
if (!$permissions) {
$permissions = $this->loadUserPermissions($userId);
$this->redis->set($key, json_encode($permissions), 3600);
} else {
$permissions = json_decode($permissions, true);
}
return $permissions;
}
public function clearUserPermissions($userId)
{
$key = $this->prefix . $userId;
$this->redis->del($key);
}
}
4.2 数据库查询优化
使用关联预加载和字段缓存优化查询:
namespace appadminmodel;
class AdminUser extends Model
{
// 定义角色关联
public function role()
{
return $this->belongsTo(Role::class);
}
// 获取用户列表(优化查询)
public function getUserList($page = 1, $limit = 15)
{
return $this->with(['role' => function($query) {
$query->cache('role_list', 300)->field('id,role_name');
}])
->field('id,username,role_id,status,create_time')
->paginate([
'list_rows' => $limit,
'page' => $page
]);
}
}
总结
通过本文的实战教程,我们完整构建了一个基于ThinkPHP 6.0多应用模式的企业级权限管理系统。该系统具备以下特点:
- 采用多应用架构,实现前后端分离
- 完善的RBAC权限控制机制
- 动态菜单生成和权限验证
- 完整的操作日志记录
- Redis缓存优化提升性能
这种架构设计不仅提高了代码的可维护性,也为后续的功能扩展奠定了坚实基础。在实际项目中,您可以根据具体需求进一步优化和扩展相关功能。
扩展资源
- ThinkPHP官方文档:https://www.thinkphp.cn
- 项目源码地址:请联系作者获取
- 在线演示:http://demo.example.com

