AccessControl 行為過濾器Yii 2 內建 yii\filters\AccessControl,透過規則陣列精準控制動作存取權限,支援角色型存取控制 (RBAC) 基礎整合。
| 參數 | 說明 |
|---|---|
only | 僅套用於指定 actions (白名單) |
except | 除指定 actions 外全部套用 (黑名單) |
rules | 規則陣列,依序匹配,第一條符合生效 |
denyCallback | 拒絕存取時的回呼 (可自定義重導向/回應) |
? — **游客** (未登入用戶)@ — **已登入用戶** (通過 Yii::$app->user->identity 識別)角色名稱 — RBAC 角色 (如 admin, editor),需配合 Yii::$app->user->can()namespace app\controllers;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\web\Controller;
class SiteController extends Controller {
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
// 策略:除了 login、signup 以外的所有動作都需登入
'except' => ['login', 'signup'],
'rules' => [
// 規則 1:允許游客存取 login、signup
[
'actions' => ['login', 'signup'],
'allow' => true,
'roles' => ['?'],
],
// 規則 2:允許已登入用戶存取其他所有 (except 已排除 login/signup)
[
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'], // 強制 POST 登出
],
],
];
}
public function actionLogin() { /* ... */ }
public function actionSignup() { /* ... */ }
public function actionProfile() { /* 需登入 */ }
public function actionSettings() { /* 需登入 */ }
}
請求 actionProfile
│
▼
AccessControl behaviors()
│
├── only/except 過濾 → 符合 (except 排除 login/signup)
│
▼
遍歷 rules 陣列:
│
├── Rule 1: actions=[login,signup] → 不匹配 → 繼續
│
├── Rule 2: actions=未指定(全部), roles=[@]
│ │
│ ├── 用戶已登入 (@ 符合) → allow=true → 允許存取 ✅
│ └── 用戶未登入 (? 符合) → roles 不匹配 → 繼續
│
▼
無規則匹配 → 預設拒絕 (denyCallback 或 403)
'rules' => [
// 管理員可存取所有後台
[
'allow' => true,
'roles' => ['admin'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->can('admin'); // RBAC 檢查
},
],
// 編輯可存取文章管理
[
'actions' => ['article-index', 'article-create', 'article-update'],
'allow' => true,
'roles' => ['editor'],
'matchCallback' => fn() => Yii::$app->user->can('editor'),
],
// 登入用戶可存取個人中心
[
'allow' => true,
'roles' => ['@'],
],
]
'denyCallback' => function ($rule, $action) {
if (Yii::$app->request->isAjax) {
return Yii::$app->response->json(['code' => 403, 'msg' => '權限不足']);
}
// 重導向至登入頁,保留原 URL
return Yii::$app->response->redirect(['site/login', 'redirect' => Yii::$app->request->url]);
},
| 誤區 | 正確做法 |
|---|---|
只用 only 不用 except | 新增動作易忘記加入 only,建議用 except 排除公開頁面 |
| 規則順序錯誤 | 具體規則 (特定 actions) 放前面,通用規則放後面 |
| 角色符號搞混 | ?=游客, @=登入用戶, 字串=RBAC角色 |
未設定 denyCallback | 預設拋 403 例外,體驗差,建議自定義重導向/JSON 回應 |
AccessControl 以 except + rules 組合實現「預設拒絕、例外允許」的安全策略。核心口訣:黑名單排除公開頁、白名單規則精準放行、角色符號分清游客與登入、拒絕回調友善回應。配合 RBAC 可構建企業級精細權限體系。