ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP6 を使用してユーザー役割権限管理を実装する方法
ビジネスの継続的な発展に伴い、多くの中小企業は独自のユーザー保守システムを備えており、ユーザー権利管理はその重要な部分を占めています。システム内の機密情報を保護し、ビジネスの正常な運用を確保するには、ロール権限管理メカニズムを使用して、異なるロールのユーザーが指定されたリソースとデータのみにアクセスできるようにする必要があります。
この記事では、ThinkPHP6 フレームワークを例として、それが提供する権限制御ミドルウェアと拡張パッケージを使用してユーザー ロールの権限管理を実装する方法を紹介します。
最初に 2 つのデータベース テーブルを定義する必要があります。1 つはシステム ロール情報を保存するために使用されるロール テーブルで、もう 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='Permission table';
ThinkPHP が提供するデータベース移行ツールを使用してテーブルを作成できます。 :phpは移行を考えます:実行します。
次に、ロールと権限モデルを作成する必要があります。 app/model ディレクトリに、Role.php および Permission.php ファイルを作成します。コードは次のとおりです:
namespace appmodel;
use thinkModel;
クラスの役割はモデルを拡張します。
#{
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 コメント 'ロール ID',
permission_id
int(11) NOT NULL コメント '権限 ID',
主キー (id
),
KEY role_id
(role_id
),
KEY permission_id
(permission_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT ='ロールと権限の関連付けテーブル';
モデル内のロールと権限の間の多対多の関係を定義します:
namespace appmodel;
use thinkModel;
class ロールはモデルを拡張
{
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, '没有权限'); }
}
このミドルウェアは、まず現在のユーザーが所有するすべてのロールをクエリします。ロールを走査するときは、クエリを実行します。 each ロールが所有するアクセス許可が現在のリクエストと一致する場合、実行の続行が許可されます。そうでない場合は、403 エラーが返されます。
システム権限の管理を容易にするために、ThinkPHP が提供する Config 関数を使用して、すべての権限を構成ファイルに書き込むことができます。 config ディレクトリに Permissions.php ファイルを作成します。コードは次のとおりです:
return [
1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',
];
これを渡すことができます。キー/値 システムのすべての権限を記録するには、キーは整数、値は権限の名前を示す文字列です。
最後に、上記のミドルウェアを実際に適用する必要があります。 config ディレクトリ内の middleware.php ファイルを開き、CheckAuth ミドルウェアを追加します。
return [
// ... 'check_auth' => appmiddlewareCheckAuth::class,
];
ミドルウェアの適用順序は、配列のキー名に従って前から後ろに実行されます。配列の添字を使用してミドルウェアの実行順序を調整できます。
アクセス許可制御が必要なコントローラーまたはメソッドでは、ミドルウェア メソッドを使用して CheckAuth ミドルウェアをバインドできます。
namespace appcontroller;
think acadeView を使用;
class UserController
{
public function create() { $this->middleware('check_auth'); // ... }
}
これまで、ThinkPHP6 を使用してユーザー ロールの権限管理を実装するためのすべての手順が完了しました。実際のビジネス ニーズに応じて、上記のサンプル コードを拡張および改善できます。
以上がThinkPHP6 を使用してユーザー役割権限管理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。