隨著業(yè)務的不斷發(fā)展,很多中小型公司都擁有了自己的用戶維護系統(tǒng),用戶權(quán)限管理是其中重要的一環(huán)。為了保護系統(tǒng)中的敏感信息、保障業(yè)務的正常運行,我們需要使用角色權(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';
登錄后復制
}
<?php
namespace appmodel;
use thinkModel;
class Permission extends Model
{
protected $table = 'permission';
登錄后復制
}
- 創(chuàng)建角色和權(quán)限關聯(lián)表
由于一個用戶可能擁有多個角色,一個角色也可能對應多個權(quán)限,所以我們需要創(chuàng)建一個角色和權(quá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)限關聯(lián)表’;
在模型中定義角色和權(quá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' ); }
登錄后復制
}
<?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' ); }
登錄后復制
}
- 定義中間件
在ThinkPHP6中,中間件是處理請求的強大工具,我們可以通過中間件來實現(xiàn)權(quán)限控制。創(chuàng)建一個CheckAuth中間件,用于判斷用戶是否有權(quán)限進行當前的操作。在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)限'); }
登錄后復制
}
該中間件會先查詢當前用戶所擁有的所有角色,在遍歷角色時,查詢每個角色所擁有的權(quán)限,如果有符合當前請求的權(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',
登錄后復制
];
我們可以通過key/value的形式來記錄系統(tǒng)所有的權(quán)限,key為一個整數(shù),value為一個字符串,表示權(quán)限的名稱。
- 應用中間件
最后,我們需要實際應用上述的中間件。打開config目錄下的middleware.php文件,添加CheckAuth中間件。
<?php
return [
// ... 'check_auth' => appmiddlewareCheckAuth::class,
登錄后復制
];
中間件的應用順序是按照數(shù)組的鍵名從前到后依次執(zhí)行的,我們可以通過數(shù)組下標來調(diào)整中間件的執(zhí)行順序。
在需要進行權(quán)限控制的控制器或方法上,可以使用middleware方法來綁定CheckAuth中間件。
<?php
namespace appcontroller;
use thinkacadeView;
class UserController
{
public function create() { $this->middleware('check_auth'); // ... }
登錄后復制
}
至此,我們已經(jīng)完成了使用ThinkPHP6實現(xiàn)用戶角色權(quán)限管理的所有步驟,您可以根據(jù)實際業(yè)務需求來擴展和完善上述示例代碼。
以上就是如何使用ThinkPHP6實現(xiàn)用戶角色權(quán)限管理的詳細內(nèi)容,更多請關注www.xfxf.net其它相關文章!