在 Yii 框架開發中,基於角色的存取控制(RBAC)是實現精細權限管理的核心機制。雖然 Yii 內建的 authManager 元件已提供 RBAC 基礎架構,但缺乏視覺化管理介面。Srbac 作為官方推薦的擴展模組,完美填補了這一空白,讓開發者能輕鬆以圖形化方式管理角色、任務與操作。
理解 Srbac 必須先掌握四個核心實體的關係:
此外,業務規則是一段 PHP 代碼片段,在權限檢查時動態執行,可實現「僅允許作者刪除自己的文章」等複雜邏輯。
Srbac 依賴以下三張表存儲權限數據:
| 欄位 | 類型 | 說明 |
|---|---|---|
| itemname | varchar(64) | 角色名稱,區分大小寫 |
| userid | varchar(64) | 用戶 ID,對應專案用戶表主鍵 |
| bizrule | text | 業務規則 PHP 代碼 |
| data | text | 序列化陣列,供 bizrule 使用 |
| 欄位 | 類型 | 說明 |
|---|---|---|
| name | varchar(64) | 項目名稱,與 authassignment.itemname 對應 |
| type | integer | 類型標識:0=Operation、1=Task、2=Role |
| description | text | 描述信息 |
| bizrule | text | 業務規則 PHP 代碼 |
| data | text | 序列化陣列 |
| 欄位 | 類型 | 說明 |
|---|---|---|
| parent | varchar(64) | 父級名稱(角色或任務) |
| child | varchar(64) | 子級名稱(任務或操作) |
使用 CWebUser::checkAccess() 進行權限驗證:
if (Yii::app()->user->checkAccess($operation, $params)) {
// $operation:角色、任務或操作名稱
// $params:傳遞給業務規則的參數陣列
// 執行受保護操作
}
實戰範例:文章刪除權限控制
$params = array('uid' => $article->author_id);
if (Yii::app()->user->checkAccess('delArticle', $params)) {
// 通過業務規則驗證:當前用戶 ID 是否等於文章作者 ID
$article->delete();
}
在模組配置文件中定義資料表映射:
public function init() {
Yii::app()->authManager->itemTable = 'AuthItem';
Yii::app()->authManager->itemChildTable = 'AuthItemChild';
Yii::app()->authManager->assignmentTable = 'UserAssignment';
}
class ProductController extends SBaseController { ... }
class SBaseController extends Controller { ... }
protected function beforeAction($action) {
$del = Helper::findModule('srbac')->delimeter;
$mod = $this->module !== null ? $this->module->id . $del : "";
$controller = str_replace("/", ".", $this->id);
$contrArr = explode("/", $controller);
$contrArr[sizeof($contrArr)-1] = ucfirst($contrArr[sizeof($contrArr)-1]);
$controller = implode(".", $contrArr);
if (sizeof($contrArr) == 1) $controller = ucfirst($controller);
$access = $mod . $controller . ucfirst($this->action->id);
// 白名單檢查
if (in_array($access, $this->allowedAccess())) return true;
// 未安裝或除錯模式跳過驗證
if (!Yii::app()->getModule('srbac')->isInstalled()) return true;
if (Yii::app()->getModule('srbac')->debug) return true;
// 核心權限驗證
if (!Yii::app()->user->checkAccess($access) || Yii::app()->user->isGuest) {
$this->onUnauthorizedAccess();
}
return true;
}
框架依序執行:
getAuthAssignments() 讀取用戶角色分配getAuthItem() 獲取授權項目詳情checkAccessRecursive() 遞迴檢查父子層級權限executeBizRule() 執行業務規則判斷將模組放入 protected/modules/,配置 main.php 後訪問安裝頁面,可選擇生成測試數據。
ControllerNameActionName(如 PostControllerDelete),首字母大寫NewsManagement)admin、editor)檢查用戶權限矩陣是否正確,確認無誤後務必關閉 debug 模式:
'modules' => array(
'srbac' => array(
'userclass' => 'User',
'userid' => 'id',
'username' => 'username',
'debug' => false, // 關鍵:生產環境必須設為 false
)
)
ControllerAction 格式,否則自動掃描失效eval(),優先用參數化查詢-)區分模組權限,如 admin-PostControllerDelete掌握 Srbac 核心機制與部署流程,即可為 Yii 應用構建企業級權限管理系統,實現資源存取的精細化控制。