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