Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk melaksanakan kawalan akses berasaskan peranan dalam Laravel

Bagaimana untuk melaksanakan kawalan akses berasaskan peranan dalam Laravel

PHPz
PHPzasal
2023-11-02 15:15:30959semak imbas

Bagaimana untuk melaksanakan kawalan akses berasaskan peranan dalam Laravel

Cara melaksanakan kawalan akses berasaskan peranan dalam Laravel

Petikan:
Dalam aplikasi web, kawalan akses ialah bahagian penting dalam melindungi data sensitif dan operasi sensitif. Kawalan capaian berasaskan peranan ialah strategi kawalan capaian biasa yang membolehkan kami mengehadkan tindakan yang boleh dilakukan oleh pengguna berdasarkan peranan mereka.

Laravel ialah rangka kerja PHP yang popular yang menyediakan ciri ringkas namun berkuasa untuk melaksanakan kawalan akses berasaskan peranan. Dalam artikel ini, kami akan membincangkan cara melaksanakan kawalan akses berasaskan peranan menggunakan Laravel dan menyediakan beberapa contoh kod konkrit.

Langkah 1: Sediakan pangkalan data
Pertama, kita perlu mencipta pangkalan data untuk menyimpan maklumat pengguna, peranan dan kebenaran. Kita boleh menggunakan ciri migrasi Laravel untuk mencipta jadual pangkalan data. Berikut ialah contoh fail migrasi pengguna, peranan dan kebenaran:

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateRolesAndPermissionsTables extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // 创建角色表
        Schema::create('roles', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();
            $table->timestamps();
        });

        // 创建权限表
        Schema::create('permissions', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();
            $table->timestamps();
        });

        // 创建用户表
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamps();
        });

        // 创建用户角色表
        Schema::create('role_user', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('role_id');
            $table->timestamps();
        });

        // 创建角色权限表
        Schema::create('permission_role', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('permission_id');
            $table->unsignedBigInteger('role_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // 删除表格
        Schema::dropIfExists('permission_role');
        Schema::dropIfExists('role_user');
        Schema::dropIfExists('users');
        Schema::dropIfExists('permissions');
        Schema::dropIfExists('roles');
    }
}

Jalankan arahan migrasi untuk mencipta jadual pangkalan data:

php artisan migrate

Langkah 2: Tentukan model dan perhubungan
Dalam Laravel, kita boleh menggunakan model dan perhubungan untuk mengurus pengguna , Data seperti peranan dan kebenaran. Berikut ialah contoh model dan definisi perhubungan:

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;

class User extends Authenticatable
{
    use HasFactory;

    /**
     * 获取用户的角色
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class, 'role_user');
    }

    /**
     * 检查用户是否具有指定角色
     */
    public function hasRole($role)
    {
        return $this->roles->contains('name', $role);
    }
}

class Role extends Model
{
    use HasFactory;

    /**
     * 获取角色的权限
     */
    public function permissions()
    {
        return $this->belongsToMany(Permission::class, 'permission_role');
    }
}

class Permission extends Model
{
    use HasFactory;
}

Langkah 3: Tentukan dasar
Dalam Laravel, dasar digunakan untuk menentukan kebenaran pengguna yang disahkan kepada sumber tertentu. Kami boleh menggunakan dasar untuk melaksanakan kawalan akses berasaskan peranan. Berikut ialah contoh definisi dasar:

<?php

namespace AppPolicies;

use AppModelsUser;
use IlluminateAuthAccessHandlesAuthorization;

class PostPolicy
{
    use HandlesAuthorization;

    /**
     * 确定用户是否有权限更新一个帖子
     */
    public function update(User $user, Post $post)
    {
        return $user->hasRole('admin') || $user->hasRole('editor');
    }
}

Langkah Empat: Daftar Polisi
Untuk menggunakan polisi, kami perlu mendaftarkannya dengan penyedia polisi Laravel. Buka fail app/Providers/AuthServiceProvider.php dan tambah kod berikut:

<?php

namespace AppProviders;

use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
use AppPoliciesPostPolicy;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        'AppModelsPost' => 'AppPoliciesPostPolicy',
    ];

    public function boot()
    {
        $this->registerPolicies();
    }
}

Langkah Lima: Gunakan Middleware
Untuk melaksanakan kawalan akses berasaskan peranan, kami boleh menggunakan perisian tengah Laravel dalam laluan dan pengawal untuk mengesahkan peranan pengguna. Berikut ialah contoh definisi perisian tengah:

<?php

namespace AppHttpMiddleware;

use Closure;

class RoleMiddleware
{
    public function handle($request, Closure $next, ...$roles)
    {
        if (!$request->user()->hasAnyRole($roles)) {
            abort(403, 'Unauthorized action.');
        }

        return $next($request);
    }
}

Langkah 6: Gunakan perisian tengah untuk menyekat akses laluan
Akhir sekali, kami boleh menggunakan perisian tengah pada laluan atau kumpulan laluan tertentu untuk menyekat akses pengguna. Berikut ialah kod untuk laluan contoh:

<?php

use AppHttpMiddlewareRoleMiddleware;

Route::get('/admin/dashboard', function () {
    // 管理员和编辑者才能访问
})->middleware(RoleMiddleware::class . ':admin,editor');

Ringkasan:
Melalui pangkalan data, model, hubungan, strategi dan fungsi perisian tengah Laravel, kami boleh melaksanakan kawalan akses berasaskan peranan dengan mudah. Di atas ialah langkah terperinci dan contoh kod tentang cara melaksanakan kawalan akses berasaskan peranan dalam Laravel. Saya harap artikel ini dapat membantu anda lebih memahami dan menggunakan fungsi kawalan akses Laravel.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kawalan akses berasaskan peranan dalam Laravel. 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