首頁 > php框架 > ThinkPHP > 如何使用ThinkPHP6實現使用者角色權限管理

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

WBOY
發布: 2023-06-20 22:06:27
原創
1598 人瀏覽過

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

本文將以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='權限表';

我們可以使用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

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT

) 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'
    );
}
登入後複製
    }
定義中間件

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

#namespace appmiddleware;

use think acadeDb;

use think acadeSession;

use think acadeConfig;

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錯誤。
建立權限設定檔

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

#return [

1 => 'user.create',
2 => 'user.read',
3 => 'user.update',
4 => 'user.delete',
登入後複製

];

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

最後,我們需要實際應用上述的中間件。開啟config目錄下的middleware.php文件,加入CheckAuth中介軟體。

return [

// ...
'check_auth' => appmiddlewareCheckAuth::class,
登入後複製

];

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

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

namespace appcontroller;

use think acadeView;

class UserController

{

public function create()
{
    $this->middleware('check_auth');
    // ...
}
登入後複製

}

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

以上是如何使用ThinkPHP6實現使用者角色權限管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板