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

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

Oct 20, 2023 pm 01:46 PM
権限制御 hyperf フレームワーク

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
クラスを継承することで権限モデルを作成できます。ターミナルで次のコマンドを実行して権限モデルを生成します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;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:php;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 {
    // 权限不足
}
ログイン後にコピー

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

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

uniappで権限制御とユーザー管理を実装する方法 uniappで権限制御とユーザー管理を実装する方法 Oct 20, 2023 am 11:15 AM

uniapp で権限制御とユーザー管理を実装する方法 モバイル アプリケーションの開発に伴い、権限制御とユーザー管理がアプリケーション開発の重要な部分になりました。 uniapp では、いくつかの実用的な方法を使用してこれら 2 つの機能を実装し、アプリケーションのセキュリティとユーザー エクスペリエンスを向上させることができます。この記事では、uniapp で権限制御とユーザー管理を実装する方法を紹介し、参考としていくつかの具体的なコード例を示します。 1. 権限制御 権限制御とは、アプリケーションを保護するために、アプリケーション内のユーザーまたはユーザー グループごとに異なる操作権限を設定することを指します。

コード分​​析に Hyperf フレームワークを使用する方法 コード分​​析に Hyperf フレームワークを使用する方法 Oct 25, 2023 am 11:12 AM

コード分​​析に Hyperf フレームワークを使用する方法には、特定のコード サンプルが必要です。 はじめに: ソフトウェア開発プロセスでは、コードの品質とパフォーマンスを適切に分析し、評価する必要があります。 Hyperf フレームワークは、高性能 PHP 開発フレームワークとして、開発者がコード分析を行うのに役立つ豊富なツールと機能を提供します。この記事では、コード分析に Hyperf フレームワークを使用する方法を紹介し、具体的なコード例で説明します。 1. コード分析ツールの選択 Hyperf フレームワークは、いくつかの実用的なツールを提供します。

クロスドメイン要求処理に Hyperf フレームワークを使用する方法 クロスドメイン要求処理に Hyperf フレームワークを使用する方法 Oct 20, 2023 pm 01:09 PM

クロスドメイン要求処理に Hyperf フレームワークを使用する方法 はじめに: 最新のネットワーク アプリケーション開発では、クロスドメイン要求が一般的な要件になっています。フロントエンドとバックエンドの開発を確実に分離し、ユーザー エクスペリエンスを向上させるために、クロスドメイン要求処理に Hyperf フレームワークを使用することが特に重要になっています。この記事では、クロスドメイン要求処理に Hyperf フレームワークを使用する方法を紹介し、具体的なコード例を示します。 1. クロスドメイン リクエストとは何ですか? クロスドメイン リクエストとは、XMLHttpReques を通じてブラウザ上で実行される JavaScript を指します。

フロー制御に Hyperf フレームワークを使用する方法 フロー制御に Hyperf フレームワークを使用する方法 Oct 20, 2023 pm 05:52 PM

フロー制御に Hyperf フレームワークを使用する方法 はじめに: 実際の開発では、同時実行性の高いシステムにとって合理的なフロー制御が非常に重要です。フロー制御は、システムを過負荷のリスクから保護し、システムの安定性とパフォーマンスを向上させるのに役立ちます。この記事では、フロー制御に Hyperf フレームワークを使用する方法と、具体的なコード例を紹介します。 1. フロー制御とは何ですか?トラフィック制御とは、大規模なトラフィック要求を処理するときにシステムが正常に動作できるようにするために、システム アクセス トラフィックの管理と制限を指します。流れ

ファイルストレージに Hyperf フレームワークを使用する方法 ファイルストレージに Hyperf フレームワークを使用する方法 Oct 25, 2023 pm 12:34 PM

ファイル ストレージに Hyperf フレームワークを使用する方法には、特定のコード サンプルが必要です。Hyperf は、Swoole 拡張機能に基づいて開発された高性能 PHP フレームワークです。コルーチン、依存関係注入、AOP、ミドルウェア、イベント管理などの強力な機能を備えています。高性能、柔軟、スケーラブルな Web アプリケーションとマイクロサービスの構築に適しています。実際のプロジェクトでは、ファイルの保存と管理が必要になることがよくありますが、Hyperf フレームワークには、ファイル ストレージの操作を簡素化するための便利なコンポーネントとツールが用意されています。この記事では使い方を紹介します

Laravel でのユーザー管理と権限制御: 複数のユーザーとロールの割り当ての実装 Laravel でのユーザー管理と権限制御: 複数のユーザーとロールの割り当ての実装 Aug 12, 2023 pm 02:57 PM

Laravel におけるユーザー管理と権限制御: マルチユーザーとロール割り当ての実装 はじめに: 最新の Web アプリケーションでは、ユーザー管理と権限制御は非常に重要な機能の 1 つです。 Laravel は、人気のある PHP フレームワークとして、複数のユーザーとロールの割り当てに対する権限制御を実装するための強力で柔軟なツールを提供します。この記事では、Laravel でユーザー管理および権限制御機能を実装する方法と、関連するコード例を紹介します。 1.インストールと設定 まず、Laravelでユーザー管理を実装します。

Laravel 権限機能のベストプラクティス: ユーザー権限を正しく制御する方法 Laravel 権限機能のベストプラクティス: ユーザー権限を正しく制御する方法 Nov 02, 2023 pm 12:32 PM

Laravel 権限関数のベストプラクティス: ユーザー権限を正しく制御するには、特定のコード例が必要です はじめに: Laravel は、効率的で安全な Web アプリケーションの開発に役立つ多くの機能とツールを提供する、非常に強力で人気のある PHP フレームワークです。重要な機能の 1 つは権限制御です。これは、ユーザーの役割と権限に基づいて、アプリケーションのさまざまな部分へのユーザー アクセスを制限します。適切な権限制御は、機密データや機能を不正アクセスから保護するための Web アプリケーションの重要なコンポーネントです。

ログ管理に Hyperf フレームワークを使用する方法 ログ管理に Hyperf フレームワークを使用する方法 Oct 25, 2023 am 09:15 AM

ログ管理に Hyperf フレームワークを使用する方法 はじめに: Hyerpf は、豊富なコンポーネントと機能を備えた、PHP 言語に基づく高性能で柔軟性の高いコルーチン フレームワークです。ログ管理はあらゆるプロジェクトの重要な部分です。この記事では、ログ管理に Hyperf フレームワークを使用する方法を紹介し、具体的なコード例を示します。 1. Hyperf フレームワークをインストールする まず、Hyperf フレームワークをインストールする必要があります。 Composer を通じてインストールできます。コマンド ライン ツールを開いて次のコマンドを入力します。

See all articles