# thinkphp6.0權限擴展
auth package for thinkphp6
# 安裝
> composer require ltxlong/thinkphp6-auth
# [](https://github.com/ltxlong/thinkphp6-auth#%E9%85%8D%E7%BD%AE)配置
~~~
// auth配置 自定義數據表位置在 ./config/auth.php里面
[
'auth_on' => 1, // 權限開關
'auth_type' => 1, // 認證方式,1為實時認證;2為登錄認證。
'auth_group' => 'auth_group', // 用戶組數據表(不帶前綴表名)
'auth_group_access' => 'auth_group_access', // 用戶-用戶組關系表(不帶前綴表名)
'auth_rule' => 'auth_rule', // 權限規則表(不帶前綴表名)
'auth_user' => 'user', // 用戶信息表(不帶前綴表名)
]
// 注意:condition里的變量是用戶表(配置auth_user的值的表,通常配置為用戶表)的字段
// (當然,不配置auth_user的值為用戶表,而是其他表,那也行的!但是,condition里的變量只能是配置的表里面的字段)
// (如配置auth_user的值為integral積分表,那么condition里的變量就只能是integral表里面的字段)
// condition里的變量用花括號括住,如:{score}
// 表的前綴在框架的數據庫配置那配置,這里的配置的表都是不帶前綴的
~~~
# [](https://github.com/ltxlong/thinkphp6-auth#%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE%E8%A1%A8)導入數據表
~~~
----------------------------------------------------------------------------
-- auth_rule,規則表,
-- id:主鍵,
-- name:規則唯一標識, title:規則中文名稱 status 狀態:為1正常,為0禁用
-- name 可以自定義名稱,也可以是模塊/控制器/方法、模塊_控制器_方法、控制器/方法、控制器_方法、控制器-方法
-- condition:規則表達式,為空表示存在就驗證,不為空表示按照條件驗證
-- condition 簡單來說,如果字段為空,則只驗證name就行;如果字段不為空,則在驗證了name的基礎上,還要驗證字段里面的條件
-- condition 條件,是user表的字段條件(準確來說,是auth_user配置的表),如 {score} > 10
----------------------------------------------------------------------------
DROP TABLE IF EXISTS `auth_rule`;
CREATE TABLE `auth_rule` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(80) NOT NULL DEFAULT '',
`title` varchar(20) NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT 1,
`condition` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
----------------------------------------------------------------------------
-- auth_group 用戶組表,
-- id:主鍵, title:用戶組中文名稱, rules:用戶組擁有的規則id, 多個規則","隔開,status 狀態:為1正常,為0禁用
----------------------------------------------------------------------------
DROP TABLE IF EXISTS `auth_group`;
CREATE TABLE `auth_group` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT 1,
`rules` varchar(80) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
----------------------------------------------------------------------------
-- auth_group_access 用戶-用戶組關系表
-- uid:用戶id,group_id:用戶組id
----------------------------------------------------------------------------
DROP TABLE IF EXISTS `auth_group_access`;
CREATE TABLE `auth_group_access` (
`uid` mediumint(8) unsigned NOT NULL,
`group_id` mediumint(8) unsigned NOT NULL,
UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
KEY `uid` (`uid`),
KEY `group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
~~~
# [](https://github.com/ltxlong/thinkphp6-auth#%E5%8E%9F%E7%90%86)原理
Auth權限認證是按規則進行認證。 在數據庫中我們有
* 規則表(auth\_rule)
* 用戶組表 (auth\_group)
* 用戶-用戶組關系表(auth\_group\_access)
我們在規則表中定義權限規則, 在用戶組表中定義每個用戶組有哪些權限規則,在用戶組明顯表中定義用戶所屬的用戶組。
下面舉例說明:
我們要判斷用戶是否有顯示一個操作按鈕的權限, 首先定義一個規則, 在規則表中添加一個名為 show\_button 的規則。 然后在用戶組表添加一個用戶組,定義這個用戶組有show\_button 的權限規則(auth\_group表中rules字段存得時規則ID,多個以逗號隔開), 然后在用戶組明細表定義 UID 為1 的用戶 屬于剛才這個的這個用戶組。
# [](https://github.com/ltxlong/thinkphp6-auth#%E4%BD%BF%E7%94%A8)使用
判斷權限方法
~~~
// 引入類庫
use think\auth\Auth;
// 獲取auth實例
$auth = Auth::instance();
// 檢測權限
if ($auth->check('show_button', 1)) { // 第一個參數是規則名稱, 第二個參數是用戶UID
//有顯示操作按鈕的權限
} else {
//沒有顯示操作按鈕的權限
}
~~~
Auth類也可以對節點進行認證,我們只要將規則名稱,定義為節點名稱就行了。 可以在自定義的公共控制器Base中定義\_initialize方法
~~~
<?php
use think\auth\Auth;
use app\BaseController;
class adminBaseController extends BaseController
{
public function _initialize()
{
parent::initialize();
$controller = request()->controller();
$action = request()->action();
$auth = new Auth();
if(!$auth->check($controller . '/' . $action, session('uid'))){
$this->error('你沒有權限訪問');
}
}
}
~~~
這時候我們可以在數據庫中添加的節點規則, 格式為: “控制器名稱/方法名稱”
使用了多應用的情況下,如果想獲取當前模塊名稱,可以這樣:
~~~
$module = app('http')->getName();
~~~
Auth 類 還可以多個規則一起認證 如:
~~~
$auth->check(['rule1', 'rule2'], uid);
~~~
或者
~~~
$auth->check('rule1,rule2', uid);
~~~
表示 認證用戶只要有rule1的權限或rule2的權限,只要有一個規則的權限,認證返回結果就為true 即認證通過。 默認多個權限的關系是 “or” 關系,也就是說多個權限中,只要有個權限通過則通過。
我們也可以定義為 “and” 關系
~~~
$auth->check(['rule1', 'rule2'], uid, 'and');
~~~
或者
~~~
$auth->check('rule1,rule2', uid, 'and');
~~~
Auth認證,一個用戶可以屬于多個用戶組。 比如我們對 show\_button這個規則進行認證, 用戶A 同時屬于 用戶組1 和用戶組2 兩個用戶組 , 用戶組1 沒有show\_button 規則權限, 但如果用戶組2 有show\_button 規則權限,則一樣會權限認證通過。
~~~
$auth->getGroups(uid)
~~~
通過上面代碼,可以獲得用戶所屬的所有用戶組,方便我們在網站上面顯示。
Auth類還可以按用戶屬性進行判斷權限, 比如 按照用戶積分進行判斷, 假設我們的用戶表 (user) 有字段 score 記錄了用戶積分。 我在規則表添加規則時,定義規則表的condition 字段,condition字段是規則條件,默認為空 表示沒有附加條件,用戶組中只有規則 就通過認證。 如果定義了 condition字段,用戶組中有規則不一定能通過認證,程序還會判斷是否滿足附加條件。 比如我們添加幾條規則:
> name字段:grade1 condition字段:{score}<100
>
> name字段:grade2 condition字段:{score}>100 && {score}<200
>
> name字段:grade3 condition字段:{score}>200 && {score}<300
這里 {score} 表示 user 表 中字段 score 的值。
那么這時候
> $auth->check('grade1', uid) 是判斷用戶積分是不是0-100
>
> $auth->check('grade2', uid) 判斷用戶積分是不是在100-200
>
> $auth->check('grade3', uid) 判斷用戶積分是不是在200-300
condition 支持的運算符號:
~~~
>= > <= < && == || !=
~~~
注意:condition表達式不支持括號(),不支持單引號'',也不支持雙引號""
復雜點的condition:
~~~
{score}<50 && {score}<100 || {name}!=abc
~~~
# [](https://github.com/ltxlong/thinkphp6-auth#%E6%9C%80%E5%90%8E)最后
因為覺得eval()函數不安全,所以自己寫了個簡單的函數來運算condition
- 空白目錄
- 數據表的創建
- auth _rule
- auth_group
- auth_group_access
- 權限示例
- Auth權限菜單
- Auth用戶組權限修改
- Auth用戶規則表
- Auth權限的使用
- 源碼示例
- thinkphp6auth
- 安裝與拓展
- auth
- thinkphp6.0權限擴展
- ThinkPHP3.2.3完整版中對Auth.class.php的使用
- ThinkPHP6.x中對Auth的使用[tp6-auth權限管理]
- Thinkphp6+Auth+LayuiAdmin+authtree權限管理
- 使用phpstudy安裝
- 使用寶塔安裝thinkphp
- thinkphp6 偽靜態配置(nginx和Apache)
- apiadmin安裝教程