### 導入數據表
> 本工具優化為多端權限認證,同時每端又支持通過傳website\_id實現同個應用saas權限制,并可通過配置auth\_rule\_unified參數來指定同個應用內是使用同個權限規則還是通過website\_id來區分多個權限規則`toadmin_`為admin后臺端,默認無表前墜,有表前墜的請自行添加
~~~
`------------------------------
-- toadmin_auth_rule,規則表,
------------------------------
DROP TABLE IF EXISTS `toadmin_auth_rule`;
CREATE TABLE `toadmin_auth_rule` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`website_id` int(10) NOT NULL DEFAULT '0' COMMENT '站點id,用于多站點,默認0',
`name` char(80) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '規則唯一標識',
`title` char(20) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '規則中文名稱',
`type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '在think_auth_rule 表中定義一條規則時,如果type為1, condition字段就可以定義規則表達式。 如定義{score}>5 and {score}<100 表示用戶的分數在5-100之間時這條規則才會通過。',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態:為1正常,為0禁用',
`condition` char(100) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '規則表達式,為空表示存在就驗證,不為空表示按照條件驗證',
`pid` int(8) NOT NULL COMMENT '父級ID',
`front` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '前端標示,前端可以根據這個來判斷是否顯示按鈕',
`menu` tinyint(1) NOT NULL DEFAULT '0' COMMENT '菜單類型,0系統,1導航菜單,2功能按鈕',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改時間',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加時間',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `name` (`website_id`,`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
------------------------------
-- toadmin_auth_group 用戶組表,
------------------------------
DROP TABLE IF EXISTS `toadmin_auth_group`;
CREATE TABLE `toadmin_auth_group` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`website_id` int(10) NOT NULL DEFAULT '0' COMMENT '站點id,用于多站點,默認0',
`title` char(100) NOT NULL DEFAULT '' COMMENT '用戶組中文名稱',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態:為1正常,為0禁用',
`rules` varchar(600) NOT NULL DEFAULT '' COMMENT '用戶組擁有的規則id, 多個規則","隔開',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改時間',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加時間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
------------------------------
-- toadmin_auth_group_access 用戶組明細表,
------------------------------
DROP TABLE IF EXISTS `toadmin_auth_group_access`;
CREATE TABLE `toadmin_auth_group_access` (
`uid` mediumint(8) unsigned NOT NULL COMMENT '用戶id',
`group_id` mediumint(8) unsigned NOT NULL COMMENT '用戶組id',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改時間',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加時間',
UNIQUE KEY `uid_group_id` (`uid`,`group_id`) USING BTREE,
KEY `uid` (`uid`) USING BTREE,
KEY `group_id` (`group_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
------------------------------
-- toadmin_auth_user 用戶賬號表,
------------------------------
DROP TABLE IF EXISTS `toadmin_auth_user`;
CREATE TABLE `toadmin_auth_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`website_id` int(10) NOT NULL DEFAULT '0' COMMENT '站點id,用于多站點,默認0',
`name` varchar(20) NOT NULL COMMENT '姓名',
`account` varchar(20) NOT NULL COMMENT '用戶名',
`password` varchar(32) NOT NULL COMMENT '用戶密碼',
`email` varchar(255) NOT NULL COMMENT '郵箱',
`tel` varchar(11) NOT NULL COMMENT '電話',
`department` varchar(255) NOT NULL COMMENT '部門',
`position` varchar(255) NOT NULL COMMENT '職位',
`status` int(1) NOT NULL DEFAULT '1' COMMENT '賬戶狀態',
`is_delete` tinyint(1) DEFAULT '0' COMMENT '是否刪除 1刪除 0未刪除',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改時間',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '添加時間',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `username` (`website_id`,`account`,`password`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
------------------------------
-- toadmin_auth_log 操作日志,
------------------------------
DROP TABLE IF EXISTS `toadmin_auth_log`;
CREATE TABLE `toadmin_auth_log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`website_id` int(10) NOT NULL DEFAULT '0' COMMENT '站點id,用于多站點,默認0',
`userid` varchar(50) NOT NULL COMMENT '用戶賬號',
`name` varchar(255) DEFAULT NULL COMMENT '用戶名',
`source` varchar(255) NOT NULL COMMENT '來源',
`route` varchar(100) DEFAULT NULL COMMENT '路由',
`operation` varchar(255) DEFAULT NULL COMMENT '動作',
`param` json DEFAULT NULL COMMENT '請求參數',
`ip` varchar(16) DEFAULT NULL COMMENT 'ip',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
PRIMARY KEY (`id`) USING BTREE,
KEY `userid` (`website_id`,`userid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
~~~
## 中間件驗證使用,中間件
~~~
ric\auth\middleware\Auth::class
可以在config/middleware.php 中添加一條別名記錄
'auth' => ric\auth\middleware\Auth::class,
例如路由:
Route::get('/', 'index/controller/Index/index');
使用后為:
Route::get('/', 'index/controller/Index/index')->middleware(auth,['admin','login']);
第一個參數:必填參數,用于標示是調用哪個端,對應config/auth.php 配置中的一維鍵
第二個參數:選填,用于標示是否使用auth權限驗證或者登錄退出,login登錄、logout退出、getinfo獲取登錄用戶信息、log記錄日志信息、getrule獲取所有權限列表
其中,login、logout成功時,會自動記錄日志信息,其它需要配置第二個參數時才會記錄日志信息到toadmin_auth_log表
~~~
## [](https://gitee.com/tojeekup/thinkphp6-auth#%E5%86%85%E7%BD%AE%E6%96%B9%E6%B3%95)內置方法
本包內置了,用戶、權限、用戶組等增刪改查方法,詳情查看 /vendor/ric/thinkphp6-auth/Auth.php類 如:獲取用戶組:
~~~
/**
* 用戶組列表
*/
public function getGroupAll($current_page,$per_page)
{
$list = Db::table($this->config['auth_group'])
->where([])->withoutField('password')->paginate([
'list_rows'=> $per_page?:10, //每頁數量
'var_page' => 'page', //分頁變量
'page' => $current_page?:1, //當前頁面
]);
return $list->toArray();
}
~~~
在路由中例子為:
~~~
Route::post('auth/getGroupAll', 'Auth/getGroupAll')->middleware('auth',['admin']);
~~~
在自己控制器中的調用方式例子為:
~~~
/**
* @title 獲取用戶組列表
* @desc 用戶組列表
* @author Ric
* @version 1.0
*
* @param int $current_page 1 分頁數,指定獲取第幾頁的數據 require_分頁數不能為空.number
* @param int $per_page 10 分頁大小,指定分頁大小 require_分頁大小不能為空.number
*
* @return int id 1212
* @return int website_id 445 站點id,用于多站點,默認0
* @return char title 55 用戶組中文名稱
* @return tinyint status 473 狀態:為1正常,為0禁用
* @return varchar rules 579 用戶組擁有的規則id, 多個規則","隔開
* @return datetime create_time 255 最后修改時間
* @return datetime update_time 533 添加時間
*/
public function getGroupAll()
{
//獲取參數
$data = request()->param();
$list = request()->middleware('auth')->getGroupAll($data['current_page'], $data['per_page']);
return totrue($list);
}
~~~
通過request()->middleware('auth') 來直接調用該包的類
## [](https://gitee.com/tojeekup/thinkphp6-auth#%E5%BB%BA%E8%AE%AE)建議
toadmin\_auth\_rule 中規則按頁面結構進行創建,共用的部分統一放base中 比如 base 系統共用 -- 上傳 website 站點管理頁面,一級菜單 -- 查看信息 查看站點信息 -- 修改信息 修改站點信息 -- 添加信息 添加站點信息
通過中間件定義,可以獲得用戶所屬的所有用戶組,方便我們在網站上面顯示。
Auth類還可以按用戶屬性進行判斷權限, 比如 按照用戶積分進行判斷, 假設我們的用戶表 (admin\_members) 有字段 score 記錄了用戶積分。 我在規則表添加規則時,定義規則表的condition 字段,condition字段是規則條件,默認為空 表示沒有附加條件,用戶組中只有規則 就通過認證。 如果定義了 condition字段,用戶組中有規則不一定能通過認證,程序還會判斷是否滿足附加條件。 比如我們添加幾條規則:
> `name`字段:grade1`condition`字段:{score}<100
> `name`字段:grade2`condition`字段:{score}>100 and {score}<200
> `name`字段:grade3`condition`字段:{score}>200 and {score}<300
這里`{score}`表示`admin_members`表 中字段`score`的值。
那么這時候
> auth?\>check(′grade1′,uid)是判斷用戶積分是不是0?100auth?\>check(′grade1′,uid)是判斷用戶積分是不是0?100auth->check('grade2', uid) 判斷用戶積分是不是在100-200
> $auth->check('grade3', uid) 判斷用戶積分是不是在200-300
## [](https://gitee.com/tojeekup/thinkphp6-auth#json%E8%BF%94%E5%9B%9E%E8%AF%B4%E6%98%8E)json返回說明
該應用內置了兩個json輸出函數,通過這兩個函數可以輸出統一格式的json,格式如下:
~~~
{
"status": '狀態碼',
"message": "消息提示",
"data": '數據內容'
}
~~~
~~~
/**
* 返回json信息
* @param string $status 當前錯誤狀態
* @param string $message 返回錯誤信息前追加內容,默認為空
*/
function tofalse($status,$message=''){
try {
$data = tocode(100,$e->getMessage());
return json($data);
} catch (\Exception $e) {
return json(tocode(-1,$e->getMessage()));
}
}
~~~
~~~
/**
* 返回操作成功json信息
* @param array $object 當前返回對象
* @param string $special 特殊返回對象處理 有類型:select
*/
function totrue($object,$message=''){
try {
$data = tocode(100,$e->getMessage());
$data['data'] = $object;
ob_clean();
return json($data);
} catch (\Exception $e) {
return json(tocode(-1,$e->getMessage()));
}
}
~~~
### [](https://gitee.com/tojeekup/thinkphp6-auth#apirpc%E5%87%BD%E6%95%B0%E8%AF%B4%E6%98%8E)api、rpc函數說明
> thinkphp6 取消了action 跨應用調用類,rpc函數即為該函數的替代品,可以實現,跨應用、跨目錄調用 例:
rpc: 第一個參數為類名,填寫完整的,方便ide調整,第二個參數為方法名,第三個參數為傳值
~~~
$isexist= rpc('app\admin\logic\authadmin\UserLogic', 'exist_account', [$account]);
~~~
api: 第一個參數為類名,第一個參數為傳值,其中$data 數據是對應形式,鍵和api文件定義的需要一直,會根據api文件 的定義自動做數據效驗。
~~~
$data = [
'website_id' => $website_id,
];
$webinfo = api('app\website\api\config\Info',$data);
~~~
app\\website\\api\\config\\Info.php 文件例子
~~~
<?php
namespace app\website\api\config;
use think\Validate;
final class Info extends Validate
{
public $apiDescription = '獲取站點配置詳情';
//API字段表,調用時,會自動根據這個設置來進行數據驗證
public $params = [
'website_id' => ['valid'=>'require.站點ID不能為空|number', 'title'=>'站點id', 'desc'=>'用于區分站點'],
];
//處理數據,創建驗證器
public function __construct(){
list($this->rule,$this->message) = getValidate($this->params);
parent::__construct();
}
/**
* 詳情,其中參數名稱要和$params中定義的一致
*/
public function api($website_id)
{
return rpc('app\website\logic\WebConfig', 'getWebConfigFind', [$website_id]);
}
}
~~~
> 在開發時,建議采用領域應用模式開發,即每個應用,通過api提供接口,對其它應用對接,然后api接口通過rpc方法處理 內部領域內容,一個應用即為一個領域。博主的目錄結構如下,僅供參考:
~~~
app
-- website 站點管理應用 (該應用提供站點管理服務,對平臺內部,不設置路由,不直接對外提供接口,核心api、logic、dao三層)
-- api 對平臺提供api服務,通過rpc調用自身的logic和dao層,進行業務處理,一個文件即一個接口
-- config 站點配置信息
-- Add.php 添加站點配置信息
-- Info.php 獲取站點配置信息
-- logic 業務處理
-- dao 數據處理
-- toadmin 后臺平臺api (該應用為后臺平臺提供api接口,設置路由,供前端調用,編寫頁面,核心controller,無其它)
-- controller 控制器,根據需要通過api函數調用 website站點的api 接口,獲取信息,返回數據
-- topc pc端平臺api (該應用為pc端提供api接口,設置路由,供前端調用,編寫頁面,核心controller,無其它)
-- controller 控制器,根據需要通過api函數調用 website站點的api 接口,獲取信息,返回數據
~~~
## [](https://gitee.com/tojeekup/thinkphp6-auth#%E8%AF%B4%E6%98%8E)說明
為啥api是一個接口一個文件嗯? 1、方便管理 2、后續會提供自動生產api文檔,避免通用的功能不同人,或者時間久了維護時,拼命的寫相同功能的方法,導致方法冗余嚴重,越來越難維護 3、為后續其它應用做準備
# [](https://gitee.com/tojeekup/thinkphp6-auth#%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97)更新日志
> 20210313 v1.0.39
* 升級多website模式下,路由權限表需要重復復制填寫問題,適用bbc網站,商家端等類似場景,配置項實現
> 20200706 v1.0.35
* 升級了登陸接口,可進行中間件進行小程序自動登陸
> 20191012 v1.0.31
* 中間件調整,src/middleware/Auth.php中31行,獲取站點字段參數由website\_id調整為base\_website\_id,以及獲取參數與獲取中間件調換位置。
> 20190912 v1.0.7
* 更新TP6 升級session導致的部分方法失效問題
https://gitee.com/tojeekup/thinkphp6-auth
- 空白目錄
- 數據表的創建
- 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安裝教程