ThinkPHP 6.0多应用模式实战:构建企业级权限管理系统

2025-11-17 0 748

前言

在企业级应用开发中,权限管理是不可或缺的核心模块。本文将基于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
ThinkPHP 6.0多应用模式实战:构建企业级权限管理系统
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

淘吗网 thinkphp ThinkPHP 6.0多应用模式实战:构建企业级权限管理系统 https://www.taomawang.com/server/thinkphp/1435.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务