鑒權(quán)
webman/admin
目前只支持管理員鑒權(quán)。
原理
wa_rules
表中存儲著菜單和菜單下對應(yīng)的權(quán)限(控制器@動作
),例如
+----+--------------+----------------------------------------------------+
| id | title | key |
+----+--------------+----------------------------------------------------+
| 4 | 賬戶管理 | plugin\admin\app\controller\UserController |
| 74 | 插入 | plugin\admin\app\controller\UserController@insert |
| 75 | 更新 | plugin\admin\app\controller\UserController@update |
| 76 | 刪除 | plugin\admin\app\controller\UserController@delete |
| 77 | 查詢 | plugin\admin\app\controller\UserController@select |
+----+--------------+----------------------------------------------------+
每個管理員都有一個或多個角色,每個角色在wa_rules
表里都對應(yīng)著一系列可訪問控制器@動作
的記錄。
例如管理員訪問url路徑為/app/admin/user/insert
時,鑒權(quán)中間件會判斷當(dāng)前管理員的角色里是否有plugin\admin\app\controller\UserController@insert
的記錄,有的話就有權(quán)限,否則沒有權(quán)限。
提示
鑒權(quán)中間件在plugin/admin/app/middleware/AccessControl.php
頁面內(nèi)鑒權(quán)
有時候我們需要控制頁面的某部分例如某個按鈕只展現(xiàn)給有權(quán)限的管理員查看,這時可以通過給相關(guān)頁面dom節(jié)點增加 permission 屬性,例如
<div>
<button permission="app.admin.admin.insert">
新增
</button>
<button permission="app.admin.admin.delete">
刪除
</button>
</div>
permission的值實際上是變種的url路徑(/
用.
代替,字母全部小寫),例如新增按鈕需要請求的url路徑是/app/admin/admin/insert
,則permission="app.admin.admin.insert"
,如果當(dāng)前管理員在wa_rules
表里沒有plugin\admin\app\controller\AdminController@insert
對應(yīng)的記錄,則無法看到插入按鈕。
權(quán)限注釋
給控制器的方法添加注釋,這樣能讓權(quán)限系統(tǒng)自動識別菜單綁定的控制器對應(yīng)的權(quán)限名稱,方便在"角色管理"里為角色識別并添加權(quán)限。
例如"權(quán)限管理"下的"賬戶管理"菜單綁定的控制器類為plugin\admin\app\controller\AdminController
,這個類的每個方法的注釋如下
<?php
namespace plugin\admin\app\controller;
use plugin\admin\app\controller\Crud;
use support\Request;
class AdminController extends Crud
{
/**
* 刪除
*/
public function delete(Request $request){}
/**
* 查詢
*/
public function select(Request $request){}
/**
* 添加
*/
public function insert(Request $request){}
/**
* 更新
*/
public function update(Request $request){}
}
則在角色管理時就會顯示該菜單下的具體權(quán)限名稱,如圖。
假設(shè)權(quán)限勾選了"賬戶管理"下的"查詢"選項,那么這個角色就有了訪問plugin\admin\app\controller\AdminController
控制器的select
方法的權(quán)限。
超級管理員
系統(tǒng)自帶一個超級管理員角色,這個角色的權(quán)限為*
,代表著可以訪問系統(tǒng)的任何控制器及方法。開發(fā)者不要更改或者刪除這個角色。
登錄白名單
有時候某些action不需要登錄就可以訪問,例如登錄驗證請求、驗證碼請求等,這時候我們可以給控制器添加一個$noNeedLogin
屬性,里面填寫當(dāng)前控制器不需要登錄就可訪問的action名稱,例如
<?php
namespace plugin\admin\app\controller;
use plugin\admin\app\controller\Base;
/**
* 管理員賬戶
*/
class AccountController extends Base
{
/**
* 不需要登錄的方法
* @var string[]
*/
public $noNeedLogin = ['login', 'captcha'];
}
鑒權(quán)白名單
有時候某些action不需要鑒權(quán)(但需要登錄),例如獲取當(dāng)前登錄管理員的信息接口,此時可以給控制器添加一個$noNeedAuth
屬性,例如
<?php
namespace plugin\admin\app\controller;
use plugin\admin\app\controller\Base;
/**
* 管理員賬戶
*/
class AccountController extends Base
{
/**
* 不需要鑒權(quán)的方法
* @var string[]
*/
public $noNeedAuth = ['info'];
}
數(shù)據(jù)限制
有些表的數(shù)據(jù)很敏感,不能給所有管理員查看,這時候我們可以使用數(shù)據(jù)限制功能,只展示當(dāng)前管理員可查看的數(shù)據(jù)。數(shù)據(jù)限制通過控制器的$dataLimit
和$dataLimitField
兩個屬性來控制,例如
class FooController extends Crud
{
/**
* 開啟auth數(shù)據(jù)限制
* @var string
*/
protected $dataLimit = 'auth';
/**
* 以admin_id為數(shù)據(jù)限制字段
* @var string
*/
protected $dataLimitField = 'admin_id';
}
$dataLimit 標(biāo)識數(shù)據(jù)限制類型,可選值為有
- null 不做限制,任何管理員都可以查看該表的所有數(shù)據(jù)
- auth 管理員能看到自己以及自己的子管理員插入的數(shù)據(jù)
- personal 管理員只能看到自己插入的數(shù)據(jù)
$dataLimitField 表中存儲admin_id字段的名字,絕大部分情況下是admin_id
數(shù)據(jù)限制的邏輯在 plugin/admin/app/controller/Crud.php
中的 selectInput
方法中。
外部系統(tǒng)接入鑒權(quán)
請參考其它系統(tǒng)接入