Rumah >rangka kerja php >ThinkPHP >Panduan Pengurusan Kebenaran ThinkPHP6: Melaksanakan Kawalan Kebenaran Pengguna

Panduan Pengurusan Kebenaran ThinkPHP6: Melaksanakan Kawalan Kebenaran Pengguna

王林
王林asal
2023-08-13 18:09:072104semak imbas

Panduan Pengurusan Kebenaran ThinkPHP6: Melaksanakan Kawalan Kebenaran Pengguna

ThinkPHP6 Panduan Pengurusan Kebenaran: Melaksanakan Kawalan Kebenaran Pengguna

Pengenalan:
Dalam aplikasi web, pengurusan kebenaran merupakan bahagian yang sangat penting untuk membantu kami mengawal kebenaran akses dan operasi pengguna kepada sumber sistem dan melindungi keselamatan sistem . Dalam rangka kerja ThinkPHP6, kami boleh menggunakan fungsi pengurusan kebenaran yang berkuasa untuk melaksanakan kawalan kebenaran pengguna.

1 Buat jadual pangkalan data
Sebelum kami mula melaksanakan kawalan kebenaran pengguna, kami perlu mencipta jadual pangkalan data yang sepadan untuk menyimpan maklumat pengguna, peranan dan kebenaran. Berikut ialah pernyataan SQL untuk mencipta jadual:

  1. Jadual pengguna (pengguna):
    CREATE JADUAL pengguna (user (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    username varchar(50) NOT NULL COMMENT '用户名',
    password char(32) NOT NULL COMMENT '密码',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
  2. 角色表(role):
    CREATE TABLE role (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID',
    name varchar(50) NOT NULL COMMENT '角色名称',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
  3. 权限表(permission):
    CREATE TABLE permission (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
    name varchar(50) NOT NULL COMMENT '权限名称',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表';
  4. 用户-角色关联表(user_role):
    CREATE TABLE user_role (
    user_id int(11) unsigned NOT NULL COMMENT '用户ID',
    role_id int(11) unsigned NOT NULL COMMENT '角色ID',
    PRIMARY KEY (user_id,role_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户-角色关联表';
  5. 角色-权限关联表(role_permission):
    CREATE TABLE role_permission (
    role_id int(11) unsigned NOT NULL COMMENT '角色ID',
    permission_id int(11) unsigned NOT NULL COMMENT '权限ID',
    PRIMARY KEY (role_id,permission_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色-权限关联表';

二、定义模型关联
在ThinkPHP6中,我们可以使用模型关联来建立用户、角色和权限之间的关系。以下是相应的模型定义:

  1. 用户模型(User.php):
    namespace appmodel;

use thinkModel;

class User extends Model
{

// 用户-角色关联
public function roles()
{
    return $this->belongsToMany(Role::class, 'user_role');
}

}

  1. 角色模型(Role.php):
    namespace appmodel;

use thinkModel;

class Role extends Model
{

// 角色-权限关联
public function permissions()
{
    return $this->belongsToMany(Permission::class, 'role_permission');
}

}

  1. 权限模型(Permission.php):
    namespace appmodel;

use thinkModel;

class Permission extends Model
{

// 权限-角色关联
public function roles()
{
    return $this->belongsToMany(Role::class, 'role_permission');
}

}

三、定义权限中间件
在ThinkPHP6中,我们可以使用中间件来统一处理用户权限的验证。以下是一个简单的权限中间件定义示例:

  1. 创建中间件类:
    namespace appmiddleware;

use appmodelPermission;
use thinkacadeRequest;
use thinkacadeSession;
use thinkResponse;

class AuthMiddleware
{

public function handle(Request $request, Closure $next)
{
    // 获取当前请求的URL
    $url = $request->baseUrl();

    // 获取当前用户的角色信息
    $roles = Session::get('user.roles');

    // 获取当前角色拥有的权限
    $permissions = [];
    foreach ($roles as $role) {
        $rolePermissions = Permission::whereHas('roles', function ($query) use ($role) {
            $query->where('role_id', $role['id']);
        })->select();
        $permissions = array_merge($permissions, $rolePermissions->toArray());
    }

    // 验证权限
    foreach ($permissions as $permission) {
        if ($permission['name'] == $url) {
            return $next($request);
        }
    }

    // 没有权限,跳转到无权限页面
    return Response::create('您没有权限访问该页面!', 'html', 403);
}

}

  1. 注册中间件:
    我们可以将权限中间件注册到应用的中间件配置文件(middleware.php)中,如下所示:
    return [
    // ...
    ppmiddlewareAuthMiddleware::class,
    // ...
    ];

四、应用权限中间件
我们可以通过在路由定义中使用中间件来应用权限验证。以下是一个示例路由定义:

use thinkacadeRoute;

Route::group('admin', function () {

// 需要验证权限的页面
Route::rule('user/index', 'admin/user/index')
    ->middleware('AuthMiddleware');
// ...
// 其他路由定义
// ...

})->middleware('AuthMiddleware');

在上述示例中,我们通过使用middleware('AuthMiddleware') id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID Pengguna ',

nama pengguna varchar(50) BUKAN NULL ULASAN 'nama pengguna',

kata laluan char(32) BUKAN NULL ULASAN 'kata laluan',
KUNCI UTAMA ( id)

) ENGINE=CHARSET LAALA InnoDB=utf8mb4 KOMEN='Jadual pengguna';🎜Jadual peranan (peranan):🎜BUAT JADUAL peranan (🎜 id int(11) unsigned NOT NULL AUTO_INCREMENT ULASAN 'role ID',🎜 name varchar(50) NOT NULL COMMENT 'role name',🎜 PRIMARY KUNCI (id)🎜) ENJIN=CHARSET LALAI InnoDB=utf8mb4 KOMEN='jadual peranan';🎜Jadual kebenaran (kebenaran): 🎜BUAT JADUAL <kod>kebenaran</kod> (🎜 <kod>id code> int(11) unsigned NOT NULL AUTO_INCREMENT ULASAN 'ID Kebenaran',🎜 <kod>nama</kod></kod> varchar(50) BUKAN NULL ULASAN 'Nama kebenaran',🎜 KUNCI UTAMA (id) 🎜) ENJIN=CHARSET LALAI InnoDB=utf8mb4 KOMEN='Jadual kebenaran';🎜Jadual perkaitan peranan pengguna (peranan_pengguna): 🎜CIPTA JADUAL peranan_pengguna (🎜 id_pengguna int (11) unsigned NOT NULL ULASAN 'User ID',🎜 role_id int (11) unsigned NOT NULL COMMENT 'Role ID',🎜 PRIMARY KUNCI (user_id, role_id)🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='User-role association table';🎜Role-permission association (role_permission): 🎜CREATE JADUAL role_permission kod> (🎜 role_id int(11) unsigned NOT NULL ULASAN 'role ID',🎜 permission_id int(11) unsigned NOT NULL COMMENT 'permission ID',🎜 PRIMARY KUNCI (role_id,permission_id)🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Role-permission association table';🎜2 perkaitan model 🎜Dalam ThinkPHP6, kita boleh menggunakan perkaitan model untuk mewujudkan perhubungan antara pengguna, peranan dan kebenaran. Berikut ialah definisi model yang sepadan: 🎜🎜🎜Model pengguna (User.php): 🎜namespace appmodel; 🎜gunakan thinkModel 🎜🎜class User extends Model 🎜{🎜rrreee🎜}🎜
    🎜Role Model (Role.php): 🎜namespace appmodel;
🎜gunakan thinkModel;🎜🎜class Role extends Model🎜{🎜rrreee🎜}🎜
    🎜Model kebenaran (Permission.php): 🎜namespace appmodel;
🎜gunakan thinkModel;🎜🎜kelas Kebenaran melanjutkan Model🎜{🎜rrreee🎜}🎜🎜3. Tentukan perisian tengah kebenaran🎜dalam ThinkPHP6 , kita boleh menggunakan middleware untuk mengendalikan pengesahan kebenaran pengguna secara seragam. Berikut ialah contoh definisi middleware kebenaran mudah: 🎜🎜🎜Buat kelas middleware: 🎜namespace appmiddleware;🎜use appmodelPermission;🎜use think acadeRequest;🎜use think acadeSession;🎜use thinkResponse; 🎜 🎜class AuthMiddleware🎜{🎜rrreee🎜}🎜
    🎜Daftar middleware: 🎜Kami boleh mendaftarkan middleware kebenaran ke dalam fail konfigurasi middleware aplikasi (middleware.php) seperti berikut: 🎜 / return [🎜 / ...🎜 ppmiddlewareAuthMiddleware::class,🎜 // ...🎜];
🎜4 Gunakan perisian tengah kebenaran🎜Kami boleh menggunakan perisian tengah dalam definisi laluan untuk menggunakan pengesahan kebenaran. Berikut ialah contoh definisi laluan: 🎜🎜gunakan think acadeRoute;🎜🎜Route::group('admin', function () {🎜rrreee🎜})->middleware('AuthMiddleware');🎜🎜Dalam contoh di atas, Kami menggunakan kaedah middleware('AuthMiddleware') untuk menggunakan middleware kebenaran untuk mengesahkan dan mengawal kebenaran pengguna. 🎜🎜Kesimpulan: 🎜Melalui langkah di atas, kami boleh merealisasikan pengurusan dan kawalan kebenaran pengguna dalam rangka kerja ThinkPHP6. Menggunakan perkaitan model dan perisian tengah, kami boleh merealisasikan perhubungan antara pengguna, peranan dan kebenaran dengan mudah, serta menggunakan perisian tengah untuk melaksanakan pengesahan kebenaran dan memintas serta memproses apabila pengguna mengakses halaman terhad. Ini boleh melindungi keselamatan sumber sistem dengan berkesan dan menyediakan sistem dengan fungsi kawalan kebenaran pengguna yang lebih baik. 🎜

Atas ialah kandungan terperinci Panduan Pengurusan Kebenaran ThinkPHP6: Melaksanakan Kawalan Kebenaran Pengguna. 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