如何使用ThinkPHP6實現用戶角色權限管理

隨著業務的不斷發展,很多中小型公司都擁有了自己的用戶維護系統,用戶權限管理是其中重要的一環。為了保護系統中的敏感信息、保障業務的正常運行,我們需要使用角色權限管理機制,保證不同角色的用戶只能訪問指定的資源和數據。

本文將以thinkphp6框架為例,介紹如何使用其提供的權限控制中間件和擴展擴展包實現用戶角色權限管理。

  1. 創建角色表和權限表

首先我們需要定義兩個數據庫表,一個是角色表,用來存儲系統角色信息;另一個是權限表,用來存儲系統權限信息。

CREATE TABLE role (
id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主鍵’,
name varchar(20) NOT NULL COMMENT ‘角色名稱’,
description varchar(50) NOT NULL COMMENT ‘角色描述’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’角色表’;

CREATE TABLE permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主鍵’,
name varchar(20) NOT NULL COMMENT ‘權限名稱’,
description varchar(50) NOT NULL COMMENT ‘權限描述’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’權限表’;

立即學習PHP免費學習筆記(深入)”;

我們可以使用ThinkPHP提供的數據庫遷移工具來創建表:php think migrate:run。

  1. 創建角色和權限模型

接下來,我們需要創建角色和權限的模型。在app/model目錄下創建Role.php和Permission.php文件,代碼如下:

namespace appmodel;

use thinkModel;

class Role extends Model
{

protected $table = 'role';

}

namespace appmodel;

use thinkModel;

class Permission extends Model
{

protected $table = 'permission';

}

  1. 創建角色和權限關聯表

由于一個用戶可能擁有多個角色,一個角色也可能對應多個權限,所以我們需要創建一個角色和權限的關聯表。在數據庫中創建一個role_permission表。

CREATE TABLE role_permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主鍵’,
role_id int(11) NOT NULL COMMENT ‘角色ID’,
permission_id int(11) NOT NULL COMMENT ‘權限ID’,
PRIMARY KEY (id),
KEY role_id (role_id),
KEY permission_id (permission_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’角色-權限關聯表’;

在模型中定義角色和權限的多對多關系:

namespace appmodel;

use thinkModel;

class Role extends Model
{

protected $table = 'role';  public function permissions() {     return $this->belongsToMany(         Permission::class,         'role_permission',         'role_id',         'permission_id'     ); }

}

namespace appmodel;

use thinkModel;

class Permission extends Model
{

protected $table = 'permission';  public function roles() {     return $this->belongsToMany(         Role::class,         'role_permission',         'permission_id',         'role_id'     ); }

}

  1. 定義中間件

在ThinkPHP6中,中間件是處理請求的強大工具,我們可以通過中間件來實現權限控制。創建一個CheckAuth中間件,用于判斷用戶是否有權限進行當前的操作。在appmiddleware目錄下創建CheckAuth.php文件,代碼如下:

namespace appmiddleware;

use thinkacadeDb;
use thinkacadeSession;
use thinkacadeConfig;

class CheckAuth
{

public function handle($request, Closure $next) {     if (Session::has('user')) {         $roles = Db::table('user')             ->alias('u')             ->leftJoin('role_user ru', 'u.id = ru.user_id')             ->leftJoin('role r', 'ru.role_id = r.id')             ->where('u.id', '=', Session::get('user')->id)             ->field('r.id')             ->select();         $permissions = Config::get('permissions');         foreach ($roles as $role) {             $rolePermissions = Db::table('role_permission')                 ->where('role_id', '=', $role->id)                 ->field('permission_id')                 ->select();             foreach ($rolePermissions as $rolePermission) {                 if (in_array($rolePermission->permission_id, $permissions)) {                     return $next($request);                 }             }         }     }     abort(403, '沒有權限'); }

}

該中間件會先查詢當前用戶所擁有的所有角色,在遍歷角色時,查詢每個角色所擁有的權限,如果有符合當前請求的權限,就允許繼續執行,否則返回403錯誤。

  1. 創建權限配置文件

為了方便管理系統的權限,我們可以使用ThinkPHP提供的Config功能,將所有的權限寫入配置文件中。在config目錄下創建一個permissions.php文件,代碼如下:

return [

1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',

];

我們可以通過key/value的形式來記錄系統所有的權限,key為一個整數,value為一個字符串,表示權限的名稱。

  1. 應用中間件

最后,我們需要實際應用上述的中間件。打開config目錄下的middleware.php文件,添加CheckAuth中間件。

return [

// ... 'check_auth' => appmiddlewareCheckAuth::class,

];

中間件的應用順序是按照數組的鍵名從前到后依次執行的,我們可以通過數組下標來調整中間件的執行順序。

在需要進行權限控制的控制器或方法上,可以使用middleware方法來綁定CheckAuth中間件。

namespace appcontroller;

use thinkacadeView;

class UserController
{

public function create() {     $this->middleware('check_auth');     // ... }

}

至此,我們已經完成了使用ThinkPHP6實現用戶角色權限管理的所有步驟,您可以根據實際業務需求來擴展和完善上述示例代碼。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享