隨著業務的不斷發展,許多中小型公司都擁有了自己的使用者維護系統,使用者權限管理是其中重要的一環。為了保護系統中的敏感資訊、保障業務的正常運行,我們需要使用角色權限管理機制,確保不同角色的使用者只能存取指定的資源和資料。
本文將以ThinkPHP6框架為例,介紹如何使用其提供的權限控制中介軟體和擴充擴充套件實作使用者角色權限管理。
#首先我們要定義兩個資料庫表,一個是角色表,用來儲存系統角色資訊;另一個是權限表,用來儲存系統權限資訊。
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。
接下來,我們需要建立角色和權限的模型。在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';
}
由於一個使用者可能擁有多個角色,一個角色也可能對應多個權限,所以我們需要建立一個角色和權限的關聯表。在資料庫中建立一個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##) ='角色-權限關聯表';
在模型中定義角色和權限的多對多關係:
use thinkModel;
{
protected $table = 'role'; public function permissions() { return $this->belongsToMany( Permission::class, 'role_permission', 'role_id', 'permission_id' ); }
}
use thinkModel;
{
protected $table = 'permission'; public function roles() { return $this->belongsToMany( Role::class, 'role_permission', 'permission_id', 'role_id' ); }
在ThinkPHP6中,中間件是處理請求的強大工具,我們可以透過中間件來實現權限控制。建立一個CheckAuth中間件,用於判斷使用者是否有權限進行目前的操作。在appmiddleware目錄下建立CheckAuth.php文件,程式碼如下:
use think acadeConfig;
{
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, '没有权限'); }
}
為了方便管理系統的權限,我們可以使用ThinkPHP提供的Config功能,將所有的權限寫入設定檔中。在config目錄下建立一個permissions.php文件,程式碼如下:
1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',
];
最後,我們需要實際應用上述的中間件。開啟config目錄下的middleware.php文件,加入CheckAuth中介軟體。
// ... 'check_auth' => appmiddlewareCheckAuth::class,
];
#中間件的應用順序是按照數組的鍵名從前到後依次執行的,我們可以透過數組下標來調整中間件的執行順序。
在需要進行權限控制的控制器或方法上,可以使用middleware方法來綁定CheckAuth中介軟體。
use think acadeView;
{
public function create() { $this->middleware('check_auth'); // ... }
}
# ##至此,我們已經完成了使用ThinkPHP6實現使用者角色權限管理的所有步驟,您可以根據實際業務需求來擴展和完善上述範例程式碼。 ###以上是如何使用ThinkPHP6實現使用者角色權限管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!