Rumah  >  Artikel  >  rangka kerja php  >  Cara menggunakan rangka kerja Hyperf untuk kawalan kebenaran

Cara menggunakan rangka kerja Hyperf untuk kawalan kebenaran

WBOY
WBOYasal
2023-10-20 13:46:58842semak imbas

Cara menggunakan rangka kerja Hyperf untuk kawalan kebenaran

Cara menggunakan rangka kerja Hyperf untuk kawalan kebenaran

Pengenalan:
Apabila membangunkan aplikasi, selalunya perlu untuk melaksanakan fungsi kawalan kebenaran untuk memberi pengguna kebenaran yang berbeza dalam peranan yang berbeza. Rangka kerja Hyperf ialah rangka kerja mikroperkhidmatan PHP berprestasi tinggi yang menyediakan banyak ciri dan sambungan berkuasa, termasuk kawalan kebenaran yang fleksibel. Dalam artikel ini, kami akan meneroka cara menggunakan rangka kerja Hyperf untuk melaksanakan kawalan kebenaran dan menyediakan contoh kod khusus.

1. Buat jadual kebenaran
Pertama, kita perlu mencipta jadual kebenaran untuk menyimpan pelbagai maklumat kebenaran. Jadual pangkalan data boleh dibuat melalui fungsi pemindahan data Hyperf. Jalankan arahan berikut dalam terminal untuk menjana fail migrasi:

php bin/hyperf.php gen:migration create_permissions_table

Kemudian tambah kandungan berikut dalam fail migrasi yang dijana:

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

Seterusnya, kita perlu menambah fail konfigurasi utama projek config/autoload/ permissions.php Tambah kandungan berikut: <code>config/autoload/permissions.php中添加以下内容:

<?php

return [
    'default' => [
        'guard_name' => 'web',
        'permissions' => [
            // 在这里添加你的权限
            'create_post',
            'edit_post',
            'delete_post',
            // ...
        ],
    ],
];

然后在命令行中运行以下命令执行数据库迁移:

php bin/hyperf.php migrate

二、定义用户角色模型
在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');
    }
}

三、定义角色模型
在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);
    }
}

四、定义权限模型
在Hyperf框架中,我们还需要定义一个权限模型,该模型用于管理权限信息。同样地,我们可以通过继承HyperfDatabaseModelModel类来创建一个权限模型。在终端中执行以下命令来生成权限模型:

php bin/hyperf.php gen:model Permission

然后在生成的权限模型文件中添加以下代码:

namespace AppModel;

use HyperfDbConnectionModelModel;

class Permission extends Model
{
    protected $guarded = [];

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

五、定义权限中间件
接下来,我们需要创建一个权限中间件,用于检查用户是否有足够的权限访问某个路由。在终端中执行以下命令来生成中间件:

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

六、使用权限中间件
在路由定义中,我们可以通过使用->middleware('permission:xxx')

php bin/hyperf.php gen:controller PermissionController

Kemudian jalankan arahan berikut dalam baris arahan untuk melaksanakan migrasi pangkalan data:

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()
    {
        // 处理删除文章的逻辑
    }
}

2. Tentukan model peranan pengguna

Dalam rangka kerja Hyperf, kita perlu mentakrifkan model pengguna, yang digunakan untuk pengurusan Peranan dan kebenaran pengguna. Kita boleh mencipta model pengguna dengan mewarisi kelas HyperfDatabaseModelModel. Jalankan arahan berikut dalam terminal untuk menjana model pengguna:

$user = User::find(1);

if ($user->hasPermission('edit_post')) {
    // 给用户权限来编辑文章
} else {
    // 权限不足
}

Kemudian tambah kod berikut dalam fail model pengguna yang dijana:

rrreee
3. Tentukan model peranan

Dalam rangka kerja Hyperf, kita juga perlu menentukan peranan model. Digunakan untuk mengurus peranan dan kebenaran. Begitu juga, kita boleh mencipta model peranan dengan mewarisi kelas HyperfDatabaseModelModel. Jalankan arahan berikut dalam terminal untuk menjana model peranan: 🎜rrreee🎜 Kemudian tambah kod berikut dalam fail model peranan yang dijana: 🎜rrreee🎜 4. Tentukan model kebenaran 🎜 Dalam rangka kerja Hyperf, kita juga perlu menentukan kebenaran model. Digunakan untuk mengurus maklumat kebenaran. Begitu juga, kita boleh mencipta model kebenaran dengan mewarisi kelas HyperfDatabaseModelModel. Jalankan arahan berikut dalam terminal untuk menjana model kebenaran: 🎜rrreee🎜 Kemudian tambah kod berikut dalam fail model kebenaran yang dijana: 🎜rrreee🎜 5. Tentukan perisian tengah kebenaran 🎜 Seterusnya, kita perlu mencipta perisian tengah kebenaran untuk menyemak Sama ada pengguna mempunyai kebenaran yang mencukupi untuk mengakses laluan tertentu. Jalankan arahan berikut dalam terminal untuk menjana middleware: 🎜rrreee🎜 Kemudian tambah kod berikut dalam fail middleware yang dijana: 🎜rrreee🎜 6. Gunakan middleware kebenaran 🎜 Dalam definisi laluan, kita boleh menggunakan -&gt ;middleware( 'permission:xxx') untuk menetapkan perisian tengah kebenaran yang sepadan untuk penghalaan. Jalankan arahan berikut dalam terminal untuk menjana fail penghalaan: 🎜rrreee🎜 Kemudian tambah kod berikut dalam fail penghalaan yang dijana: 🎜rrreee🎜 7. Contoh Penggunaan 🎜 Di mana kawalan kebenaran diperlukan, kami boleh menyemak sama ada pengguna berada dalam cara berikut Mempunyai kebenaran yang mencukupi: 🎜rrreee🎜 8. Ringkasan🎜Artikel ini memperkenalkan langkah terperinci tentang cara menggunakan rangka kerja Hyperf untuk kawalan kebenaran, dan menyediakan contoh kod khusus. Dengan menggunakan fungsi pengurusan kebenaran yang disediakan oleh rangka kerja Hyperf, kami boleh melaksanakan fungsi kawalan kebenaran fleksibel untuk aplikasi kami dengan mudah. Saya harap artikel ini berguna kepada anda, terima kasih kerana membaca! 🎜

Atas ialah kandungan terperinci Cara menggunakan rangka kerja Hyperf untuk kawalan kebenaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn