首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

RBAC 基於角色的權限控制系統:核心邏輯與極簡實現

     編輯:PHP 相關知識

權限管理本質

RBAC(Role-Based Access Control)通過「用戶-角色-權限」三層映射,實現對後台功能(控制器/動作)的精細訪問控制。

數據庫設計(三表核心)

表名關鍵字段說明
userid, role_id用戶歸屬角色
rolerole_id, access_ids角色擁有的權限 ID 集合(如 "1,3,5")
accessaccess_id, controller, action具體權限點:控制器+方法

核心驗證邏輯(基類控制器實現)

<?php
class BaseController extends Controller {
    protected function _initialize() {
        // 1. 獲取當前用戶角色
        $roleId = session('role_id');
        if (empty($roleId)) $this->redirect('/login');

        // 2. 獲取角色授權的權限列表
        $role = M('role')->find($roleId);
        $accessIds = explode(',', $role['access_ids']); // 假設逗號分隔存儲
        $accessList = M('access')->where(['access_id' => ['IN', $accessIds]])->select();

        // 3. 構建允許訪問的「控制器/方法」鍵值集合
        $allowed = [];
        foreach ($accessList as $item) {
            $allowed[] = strtolower($item['controller'] . '/' . $item['action']);
        }

        // 4. 獲取當前請求路由
        $current = strtolower(CONTROLLER_NAME . '/' . ACTION_NAME);

        // 5. 權限判斷
        if (!in_array($current, $allowed)) {
            $this->error('無權限訪問', '/index');
        }
    }
}

關鍵優化建議

  1. 緩存權限數據:角色權限變動低,用 Redis/File 緩存 role_id => [允許路由列表],避免每請求查庫。
  2. 支持通配符:access 表增加 type 字段區分「精確匹配」與「控制器級通配」(如 admin/*)。
  3. 超級管理員繞過:if ($user->is_super) return true;
  4. 前端按鈕級控制:模板中 {if auth_check('user/delete')}...{/if} 渲染操作按鈕。

擴展方向

  • 引入「資源-操作」模型(Resource-Action)替代 Controller/Action,解耦業務與路由
  • 整合 CAS/SSO 單點登錄體系
  • 添加操作日誌審計
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved