Hyperf フレームワークを使用して権限を制御する方法
はじめに:
アプリケーションを開発する場合、多くの場合、権限制御機能を実装し、ユーザーにさまざまな機能を提供する必要があります。役割と権限が異なります。 Hyperf フレームワークは、柔軟な権限制御を含む多くの強力な機能と拡張機能を提供する高性能 PHP マイクロサービス フレームワークです。この記事では、Hyperf フレームワークを使用してアクセス許可制御を実装する方法を検討し、具体的なコード例を示します。
1. 権限テーブルを作成する
まず、さまざまな権限情報を保存するための権限テーブルを作成する必要があります。データベース テーブルは、Hyperf のデータ移行機能を通じて作成できます。ターミナルで次のコマンドを実行して移行ファイルを生成します:
php bin/hyperf.php gen:migration create_permissions_table
次に、生成された移行ファイルに次の内容を追加します:
<?php use HyperfDatabaseSchemaSchema; use HyperfDatabaseSchemaBlueprint; use HyperfDatabaseMigrationsMigration; use HyperfDbConnectionDb; class CreatetPermissionsTable extends Migration { /** * Run the migrations. */ public function up(): void { $tableName = 'permissions'; $exists = Db::table('information_schema.TABLES') ->where('TABLE_SCHEMA', config('databases.default.dbname')) ->where('TABLE_NAME', $tableName) ->first(); if (!$exists) { Schema::create($tableName, function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name')->unique()->comment('权限名称'); $table->string('guard_name')->default('web')->comment('守卫名称'); $table->timestamps(); }); } } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('permissions'); } }
次に、次の内容をメイン ファイルに追加する必要があります。プロジェクトの構成ファイル 次の内容を config/autoload/permissions.php
に追加します。
<?php return [ 'default' => [ 'guard_name' => 'web', 'permissions' => [ // 在这里添加你的权限 'create_post', 'edit_post', 'delete_post', // ... ], ], ];
次に、コマンド ラインで次のコマンドを実行して、データベースの移行を実行します。
php bin/hyperf.php migrate
2. ユーザー ロール モデルを定義する
Hyperf フレームワークでは、ユーザー ロールと権限を管理するために使用されるユーザー モデルを定義する必要があります。 HyperfDatabaseModelModel
クラスを継承することでユーザー モデルを作成できます。ターミナルで次のコマンドを実行してユーザー モデルを生成します。
php bin/hyperf.php gen:model User
次に、生成されたユーザー モデル ファイルに次のコードを追加します。
namespace AppModel; use HyperfDbConnectionModelModel; use HyperfUtilsApplicationContext; class User extends Model { protected $guarded = []; public function roles() { return $this->belongsToMany(Role::class); } public function hasPermission($permission) { foreach ($this->roles as $role) { if ($role->hasPermission($permission)) { return true; } } return false; } public function givePermission($permission) { $permissionModel = Permission::where('name', $permission)->first(); if (!$permissionModel) { throw new Exception("Permission {$permission} does not exist."); } $this->permissions()->sync($permissionModel, false); } public function revokePermission($permission) { $permissionModel = Permission::where('name', $permission)->first(); if (!$permissionModel) { throw new Exception("Permission {$permission} does not exist."); } $this->permissions()->detach($permissionModel); } public function permissions() { return $this->belongsToMany(Permission::class, 'user_permissions'); } }
3. ロール モデルを定義します。 Hyperf フレームワークでは、ロールと権限を管理するために使用されるロール モデルを定義する必要もあります。同様に、
HyperfDatabaseModelModel クラスを継承することでロール モデルを作成できます。ターミナルで次のコマンドを実行してロール モデルを生成します。
php bin/hyperf.php gen:model Role
namespace AppModel; use HyperfDbConnectionModelModel; class Role extends Model { protected $guarded = []; public function users() { return $this->belongsToMany(User::class); } public function permissions() { return $this->belongsToMany(Permission::class); } public function hasPermission($permission) { return $this->permissions->contains('name', $permission); } public function givePermission($permission) { $permissionModel = Permission::where('name', $permission)->first(); if (!$permissionModel) { throw new Exception("Permission {$permission} does not exist."); } $this->permissions()->sync($permissionModel, false); } public function revokePermission($permission) { $permissionModel = Permission::where('name', $permission)->first(); if (!$permissionModel) { throw new Exception("Permission {$permission} does not exist."); } $this->permissions()->detach($permissionModel); } }
HyperfDatabaseModelModel
クラスを継承することで権限モデルを作成できます。ターミナルで次のコマンドを実行して権限モデルを生成します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:shell;toolbar:false;'>php bin/hyperf.php gen:model Permission</pre><div class="contentsignin">ログイン後にコピー</div></div>
次に、生成された権限モデル ファイルに次のコードを追加します:
namespace AppModel; use HyperfDbConnectionModelModel; class Permission extends Model { protected $guarded = []; public function roles() { return $this->belongsToMany(Role::class); } }
5. 権限ミドルウェアを定義します
次に、ユーザーがルートにアクセスするための十分な権限を持っているかどうかを確認するには、権限ミドルウェアを作成する必要があります。ターミナルで次のコマンドを実行してミドルウェアを生成します:php bin/hyperf.php gen:middleware PermissionMiddleware
namespace AppMiddleware; use HyperfHttpMessageStreamSwooleStream; use HyperfHttpServerContractRequestInterface; use HyperfUtilsContext; use PsrContainerContainerInterface; use PsrHttpMessageResponseInterface; use PsrHttpServerMiddlewareInterface; use PsrHttpServerRequestHandlerInterface; class PermissionMiddleware implements MiddlewareInterface { protected $container; protected $request; public function __construct(ContainerInterface $container, RequestInterface $request) { $this->container = $container; $this->request = $request; } public function process($request, RequestHandlerInterface $handler): ResponseInterface { $user = $this->request->getAttribute('user'); $permissions = $this->request->route->permission; if ($user && $user->hasPermission($permissions)) { return $handler->handle($request); } return $this->response(403, 'Forbidden'); } protected function response($code, $message) { $data = [ 'code' => $code, 'message' => $message, ]; return Context::get(ResponseInterface::class)->withBody(new SwooleStream(json_encode($data))); } }
6. 権限ミドルウェアを使用します
ルーティング定義で、->middleware('permission:xxx')
を使用して、ルートに対応する権限ミドルウェアを設定できます。ターミナルで次のコマンドを実行してルーティング ファイルを生成します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:shell;toolbar:false;'>php bin/hyperf.php gen:controller PermissionController</pre><div class="contentsignin">ログイン後にコピー</div></div>
次に、生成されたルーティング ファイルに次のコードを追加します。
namespace AppController; use AppMiddlewarePermissionMiddleware; use HyperfHttpServerAnnotationController; use HyperfHttpServerAnnotationMiddleware; use HyperfHttpServerAnnotationRequestMapping; /** * @Controller * @Middleware(PermissionMiddleware::class) */ class PermissionController { /** * @RequestMapping(path="/permission", methods="get") * @Middleware("permission:create_post") */ public function createPost() { // 处理创建文章的逻辑 } /** * @RequestMapping(path="/permission", methods="get") * @Middleware("permission:edit_post") */ public function editPost() { // 处理编辑文章的逻辑 } /** * @RequestMapping(path="/permission", methods="get") * @Middleware("permission:delete_post") */ public function deletePost() { // 处理删除文章的逻辑 } }
7. 使用例
権限制御が必要な場合$user = User::find(1); if ($user->hasPermission('edit_post')) { // 给用户权限来编辑文章 } else { // 权限不足 }
以上がHyperf フレームワークを使用して権限を制御する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。