ホームページ  >  記事  >  PHPフレームワーク  >  Hyperf フレームワークを使用して権限を制御する方法

Hyperf フレームワークを使用して権限を制御する方法

WBOY
WBOYオリジナル
2023-10-20 13:46:58906ブラウズ

Hyperf フレームワークを使用して権限を制御する方法

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);
    }
}

4. 権限モデルを定義します。 Hyperf フレームワークでは、権限情報を管理するために使用される権限モデルも定義する必要があります。同様に、

HyperfDatabaseModelModel
クラスを継承することで権限モデルを作成できます。ターミナルで次のコマンドを実行して権限モデルを生成します: <pre class='brush:shell;toolbar:false;'>php bin/hyperf.php gen:model Permission</pre>次に、生成された権限モデル ファイルに次のコードを追加します:

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')
を使用して、ルートに対応する権限ミドルウェアを設定できます。ターミナルで次のコマンドを実行してルーティング ファイルを生成します。 <pre class='brush:shell;toolbar:false;'>php bin/hyperf.php gen:controller PermissionController</pre> 次に、生成されたルーティング ファイルに次のコードを追加します。

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 {
    // 权限不足
}

8. 概要

この記事では、Hyperf フレームワークを使用して権限を制御する方法の詳細な手順を紹介し、具体的なコード例を示します。 。 Hyperf フレームワークが提供する権限管理機能を使用することで、アプリケーションに柔軟な権限制御機能を簡単に実装できます。この記事があなたのお役に立てれば幸いです、読んでいただきありがとうございます!

以上がHyperf フレームワークを使用して権限を制御する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。