thinkphp6是一款優(yōu)秀的php框架,它為我們提供了很多高效的工具和功能。其中,auth授權(quán)是一個(gè)非常強(qiáng)大的功能,可以幫助我們?cè)趹?yīng)用程序中進(jìn)行權(quán)限管理。本文將介紹如何使用thinkphp6的auth授權(quán)。
安裝Auth組件
首先,我們需要安裝Auth組件。在終端中執(zhí)行以下命令:
composer require topthink/think-auth
安裝完成后,我們需要在配置文件中添加Auth服務(wù)提供者:
// config/app.php
return [
// ...
'providers' => [
// ...
thinkuthServiceProvider::class,
],
];
然后,我們需要執(zhí)行以下命令生成Auth配置文件:
php think auth:config
配置Auth組件
Auth組件可以通過配置來實(shí)現(xiàn)不同的權(quán)限管理需求,下面是一個(gè)基礎(chǔ)的配置:
// config/auth.php
return [
'auth_on' => true,
'auth_type' => 1,
'auth_group' => 'auth_group',
'auth_group_access' => 'auth_group_access',
'auth_rule' => 'auth_rule',
'auth_user' => 'user',
];
- auth_on:是否開啟權(quán)限認(rèn)證,true開啟,false關(guān)閉;
- auth_type:認(rèn)證方式,1為實(shí)時(shí)認(rèn)證(即每次驗(yàn)證權(quán)限時(shí)都重新獲取權(quán)限),2為登錄認(rèn)證(即用戶登錄后驗(yàn)證權(quán)限);
- auth_group:用戶組數(shù)據(jù)表名;
- auth_group_access:用戶組明細(xì)關(guān)聯(lián)表名;
- auth_rule:權(quán)限規(guī)則表;
- auth_user:用戶信息表。
創(chuàng)建權(quán)限規(guī)則
在使用Auth授權(quán)之前,我們需要先創(chuàng)建一些權(quán)限規(guī)則。權(quán)限規(guī)則可以控制用戶對(duì)不同資源的訪問權(quán)限。我們需要在數(shù)據(jù)庫中創(chuàng)建一個(gè)auth_rule表,然后通過添加記錄的方式來創(chuàng)建權(quán)限規(guī)則。
// appmodelAuthRule.php
namespace appmodel;
use thinkModel;
class AuthRule extends Model
{
//
}
接下來,我們需要在數(shù)據(jù)庫中創(chuàng)建auth_rule表:
CREATE TABLE `auth_rule` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL COMMENT '規(guī)則',
`title` VARCHAR(100) NOT NULL COMMENT '規(guī)則名稱',
`type` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '規(guī)則類型',
`status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '狀態(tài)',
`condition` TEXT COMMENT '規(guī)則表達(dá)式',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='權(quán)限規(guī)則表';
然后,我們可以通過以下方式添加一些權(quán)限規(guī)則:
use appmodelAuthRule;
$rule = new AuthRule;
$rule->name = 'admin/user/index';
$rule->title = '管理用戶';
$rule->save();
$rule = new AuthRule;
$rule->name = 'admin/user/add';
$rule->title = '添加用戶';
$rule->save();
$rule = new AuthRule;
$rule->name = 'admin/user/edit';
$rule->title = '編輯用戶';
$rule->save();
$rule = new AuthRule;
$rule->name = 'admin/user/del';
$rule->title = '刪除用戶';
$rule->save();
創(chuàng)建用戶組
除了權(quán)限規(guī)則外,我們還需要?jiǎng)?chuàng)建用戶組。用戶組是一些用戶的集合,擁有相同的訪問權(quán)限。我們需要在數(shù)據(jù)庫中創(chuàng)建一個(gè)auth_group表,然后通過添加記錄的方式來創(chuàng)建用戶組。
// appmodelAuthGroup.php
namespace appmodel;
use thinkModel;
class AuthGroup extends Model
{
//
}
接下來,我們需要在數(shù)據(jù)庫中創(chuàng)建auth_group表:
CREATE TABLE `auth_group` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL COMMENT '組名',
`status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '狀態(tài)',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用戶組表';
然后,我們可以通過以下方式添加一些用戶組:
use appmodelAuthGroup;
$group = new AuthGroup;
$group->title = '管理員';
$group->save();
$group = new AuthGroup;
$group->title = '普通用戶';
$group->save();
創(chuàng)建用戶組明細(xì)
現(xiàn)在,我們已經(jīng)創(chuàng)建了一些權(quán)限規(guī)則和用戶組。接下來,我們需要將規(guī)則分配給用戶組。我們需要在數(shù)據(jù)庫中創(chuàng)建一個(gè)auth_group_access表,然后通過添加記錄的方式來創(chuàng)建用戶組明細(xì)。
// appmodelAuthGroupAccess.php
namespace appmodel;
use thinkModel;
class AuthGroupAccess extends Model
{
//
}
接下來,我們需要在數(shù)據(jù)庫中創(chuàng)建auth_group_access表:
CREATE TABLE `auth_group_access` (
`uid` INT NOT NULL COMMENT '用戶id',
`group_id` INT NOT NULL COMMENT '用戶組id',
UNIQUE KEY `uid_group_id` (`uid`, `group_id`),
KEY `uid` (`uid`),
KEY `group_id` (`group_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='用戶組明細(xì)表';
然后,我們可以通過以下方式將權(quán)限規(guī)則分配給用戶組:
use appmodelAuthGroupAccess;
$access = new AuthGroupAccess;
$access->uid = 1;
$access->group_id = 1;
$access->save();
$access = new AuthGroupAccess;
$access->uid = 2;
$access->group_id = 2;
$access->save();
$access = new AuthGroupAccess;
$access->uid = 3;
$access->group_id = 2;
$access->save();
使用Auth授權(quán)
現(xiàn)在,我們已經(jīng)創(chuàng)建了一些權(quán)限規(guī)則和用戶組,并將規(guī)則分配給了用戶組。接下來,我們可以使用Auth授權(quán)來驗(yàn)證用戶是否有訪問權(quán)限。
// 授權(quán)驗(yàn)證
use thinkacadeSession;
use thinkacadeRequest;
use thinkacadeConfig;
use thinkacadeDb;
use thinkuthAuth;
class BaseController extends Controller
{
protected function initialize()
{
parent::initialize();
// 如果用戶未登錄,則跳轉(zhuǎn)到登錄頁面
if (!Session::has('user')) {
$this->redirect('/login');
}
$uid = Session::get('user.id');
// 如果是超級(jí)管理員,則直接通過權(quán)限驗(yàn)證
if ($uid == Config::get('admin_id')) {
return true;
}
$auth = new Auth;
$route = strtolower(Request::controller() . '/' . Request::action());
if (!$auth->check($route, $uid)) {
$this->error('無權(quán)限');
}
}
}
首先,我們需要從Session中獲取用戶登錄信息。如果用戶未登錄,則跳轉(zhuǎn)到登錄頁面。
然后,我們獲取當(dāng)前用戶的uid。如果當(dāng)前用戶是超級(jí)管理員,則直接通過權(quán)限驗(yàn)證。
否則,我們創(chuàng)建一個(gè)Auth實(shí)例,并獲取當(dāng)前請(qǐng)求的路由。然后,我們使用Auth的check方法驗(yàn)證當(dāng)前用戶是否有訪問權(quán)限。如果沒有,則拋出一個(gè)無權(quán)限的錯(cuò)誤。
小結(jié)
在本文中,我們學(xué)習(xí)了如何使用ThinkPHP6的Auth授權(quán)。我們使用Auth組件來實(shí)現(xiàn)權(quán)限管理,并創(chuàng)建了一些權(quán)限規(guī)則和用戶組。最后,我們使用Auth授權(quán)來驗(yàn)證用戶是否有訪問權(quán)限。如果您需要更高級(jí)的權(quán)限管理功能,可以通過擴(kuò)展Auth組件來實(shí)現(xiàn)。