隨著業(yè)務(wù)的不斷發(fā)展,很多中小型公司都擁有了自己的用戶維護系統(tǒng),用戶權(quán)限管理是其中重要的一環(huán)。為了保護系統(tǒng)中的敏感信息、保障業(yè)務(wù)的正常運行,我們需要使用角色權(quán)限管理機制,保證不同角色的用戶只能訪問指定的資源和數(shù)據(jù)。
本文將以ThinkPHP6框架為例,介紹如何使用其提供的權(quán)限控制中間件和擴展擴展包實現(xiàn)用戶角色權(quán)限管理。
- 創(chuàng)建角色表和權(quán)限表
首先我們需要定義兩個數(shù)據(jù)庫表,一個是角色表,用來存儲系統(tǒng)角色信息;另一個是權(quán)限表,用來存儲系統(tǒng)權(quán)限信息。
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 ‘權(quán)限名稱’,description varchar(50) NOT NULL COMMENT ‘權(quán)限描述’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’權(quán)限表’;
我們可以使用ThinkPHP提供的數(shù)據(jù)庫遷移工具來創(chuàng)建表:php think migrate:run。
- 創(chuàng)建角色和權(quán)限模型
接下來,我們需要創(chuàng)建角色和權(quán)限的模型。在app/model目錄下創(chuàng)建Role.php和Permission.php文件,代碼如下:
<?php
namespace appmodel;
use thinkModel;
class Role extends Model
{
protected $table = 'role';
登錄后復(fù)制
}
<?php
namespace appmodel;
use thinkModel;
class Permission extends Model
{
protected $table = 'permission';
登錄后復(fù)制
}
- 創(chuàng)建角色和權(quán)限關(guān)聯(lián)表
由于一個用戶可能擁有多個角色,一個角色也可能對應(yīng)多個權(quán)限,所以我們需要創(chuàng)建一個角色和權(quán)限的關(guān)聯(lián)表。在數(shù)據(jù)庫中創(chuàng)建一個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 ‘權(quán)限ID’,
PRIMARY KEY (id),
KEY role_id (role_id),
KEY permission_id (permission_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’角色-權(quán)限關(guān)聯(lián)表’;
在模型中定義角色和權(quán)限的多對多關(guān)系:
<?php
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'
);
}
登錄后復(fù)制
}
<?php
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'
);
}
登錄后復(fù)制
}
- 定義中間件
在ThinkPHP6中,中間件是處理請求的強大工具,我們可以通過中間件來實現(xiàn)權(quán)限控制。創(chuàng)建一個CheckAuth中間件,用于判斷用戶是否有權(quán)限進行當(dāng)前的操作。在appmiddleware目錄下創(chuàng)建CheckAuth.php文件,代碼如下:
<?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, '沒有權(quán)限');
}
登錄后復(fù)制
}
該中間件會先查詢當(dāng)前用戶所擁有的所有角色,在遍歷角色時,查詢每個角色所擁有的權(quán)限,如果有符合當(dāng)前請求的權(quán)限,就允許繼續(xù)執(zhí)行,否則返回403錯誤。
- 創(chuàng)建權(quán)限配置文件
為了方便管理系統(tǒng)的權(quán)限,我們可以使用ThinkPHP提供的Config功能,將所有的權(quán)限寫入配置文件中。在config目錄下創(chuàng)建一個permissions.php文件,代碼如下:
<?php
return [
1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',
登錄后復(fù)制
];
我們可以通過key/value的形式來記錄系統(tǒng)所有的權(quán)限,key為一個整數(shù),value為一個字符串,表示權(quán)限的名稱。
- 應(yīng)用中間件
最后,我們需要實際應(yīng)用上述的中間件。打開config目錄下的middleware.php文件,添加CheckAuth中間件。
<?php
return [
// ... 'check_auth' => appmiddlewareCheckAuth::class,
登錄后復(fù)制
];
中間件的應(yīng)用順序是按照數(shù)組的鍵名從前到后依次執(zhí)行的,我們可以通過數(shù)組下標(biāo)來調(diào)整中間件的執(zhí)行順序。
在需要進行權(quán)限控制的控制器或方法上,可以使用middleware方法來綁定CheckAuth中間件。
<?php
namespace appcontroller;
use thinkacadeView;
class UserController
{
public function create()
{
$this->middleware('check_auth');
// ...
}
登錄后復(fù)制
}
至此,我們已經(jīng)完成了使用ThinkPHP6實現(xiàn)用戶角色權(quán)限管理的所有步驟,您可以根據(jù)實際業(yè)務(wù)需求來擴展和完善上述示例代碼。
以上就是如何使用ThinkPHP6實現(xiàn)用戶角色權(quán)限管理的詳細內(nèi)容,更多請關(guān)注www.xfxf.net其它相關(guān)文章!






