Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Melaksanakan Kawalan Akses Berasaskan Peranan (RBAC): Menggunakan PHP dan RBAC

Melaksanakan Kawalan Akses Berasaskan Peranan (RBAC): Menggunakan PHP dan RBAC

PHPz
PHPzasal
2023-06-20 22:39:141461semak imbas

Dengan populariti aplikasi Internet, kami berharap dapat melindungi data dalam aplikasi untuk memastikan data sensitif tidak disalahgunakan atau dicuri. Salah satu penyelesaiannya ialah menggunakan kawalan akses berasaskan peranan (RBAC).

Kawalan akses berasaskan peranan (RBAC) ialah model kawalan akses berdasarkan perhubungan antara pengguna dan peranan. Idea teras model ini adalah untuk memautkan peranan pengguna kepada operasi kawalan akses, dan bukannya memautkan operasi kawalan akses terus kepada pengguna. Pendekatan ini meningkatkan fleksibiliti kawalan akses dan membolehkan pentadbir mengurus pengguna dengan lebih mudah.

Dalam artikel ini, kami akan menggunakan PHP dan RBAC untuk melaksanakan sistem kawalan akses pengguna asas. Berikut ialah jadual yang akan kami gunakan:

  • pengguna: digunakan untuk menyimpan maklumat tentang pengguna berdaftar.
  • peranan: Digunakan untuk menyimpan senarai kebenaran akses berpaksikan peranan.
  • peranan_pengguna: digunakan untuk menyimpan peranan yang menjadi milik pengguna.
  • kebenaran: digunakan untuk menyimpan senarai kebenaran dan mengakses senarai kawalan.
  • role_permissions: digunakan untuk menyimpan senarai kebenaran yang dimiliki oleh peranan.

Kami akan menggunakan langkah berikut untuk melaksanakan sistem kawalan RBAC kami:

Langkah 1: Cipta pangkalan data dan bina jadual yang berkaitan dengannya

Dalam MySQL pangkalan data Cipta pangkalan data baharu dan sediakan 4 jadual berikut:

CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE roles (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE user_roles (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT(11) NOT NULL,
    role_id INT(11) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY user_id_fk (user_id) REFERENCES users(id),
    FOREIGN KEY role_id_fk (role_id) REFERENCES roles(id)
);

CREATE TABLE permissions (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE role_permissions (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    role_id INT(11) NOT NULL,
    permission_id INT(11) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY role_id_fk (role_id) REFERENCES roles(id),
    FOREIGN KEY permission_id_fk (permission_id) REFERENCES permissions(id)
);

Langkah 2: Tulis kod PHP

Kami akan melaksanakan kelas PHP asas untuk mengendalikan sistem kawalan RBAC kami. Kelas ini akan membolehkan kami menambah pengguna, menambah peranan, menambah kebenaran, menetapkan pengguna kepada peranan dan memberikan kebenaran kepada peranan.

class Rbac {

  // 数据库连接和表名
  private $conn;
  private $users_table = "users";
  private $roles_table = "roles";
  private $user_roles_table = "user_roles";
  private $permissions_table = "permissions";
  private $role_permissions_table = "role_permissions";

  // 构造函数将数据库连接
  public function __construct($db) {
    $this->conn = $db;
  }

  // 添加用户
  public function addUser($username, $password, $email) {
    // 生成密码哈希
    $password_hash = password_hash($password, PASSWORD_BCRYPT);
    // 插入用户到数据库
    $query = "INSERT INTO " . $this->users_table . "(username, password, email) VALUES (:username, :password, :email)";
    $stmt = $this->conn->prepare($query);
    $stmt->bindParam(":username", $username);
    $stmt->bindParam(":password", $password_hash);
    $stmt->bindParam(":email", $email);
    if($stmt->execute()) {
      return true;
    } else {
      return false;
    }
  }

  // 添加角色
  public function addRole($name) {
    $query = "INSERT INTO " . $this->roles_table . "(name) VALUES (:name)";
    $stmt = $this->conn->prepare($query);
    $stmt->bindParam(":name", $name);
    if($stmt->execute()) {
      return true;
    } else {
      return false;
    }
  }

  // 添加权限
  public function addPermission($name) {
    $query = "INSERT INTO " . $this->permissions_table . "(name) VALUES (:name)";
    $stmt = $this->conn->prepare($query);
    $stmt->bindParam(":name", $name);
    if($stmt->execute()) {
      return true;
    } else {
      return false;
    }
  }

  // 将用户分配给角色
  public function assignUserRole($user_id, $role_id) {
    $query = "INSERT INTO " . $this->user_roles_table . "(user_id, role_id) VALUES (:user_id, :role_id)";
    $stmt = $this->conn->prepare($query);
    $stmt->bindParam(":user_id", $user_id);
    $stmt->bindParam(":role_id", $role_id);
    if($stmt->execute()) {
      return true;
    } else {
      return false;
    }
  }

  // 将权限分配给角色
  public function assignRolePermission($role_id, $permission_id) {
    $query = "INSERT INTO " . $this->role_permissions_table . "(role_id, permission_id) VALUES (:role_id, :permission_id)";
    $stmt = $this->conn->prepare($query);
    $stmt->bindParam(":role_id", $role_id);
    $stmt->bindParam(":permission_id", $permission_id);
    if($stmt->execute()) {
      return true;
    } else {
      return false;
    }
  }

}

Kami kini mempunyai kelas mudah yang menambah pengguna, menambah peranan, menambah kebenaran, memberikan pengguna kepada peranan dan memberikan kebenaran kepada peranan.

Langkah 3: Uji

Kami kini boleh mencipta skrip ujian untuk menguji sistem kawalan RBAC kami. Berikut ialah kod contoh:

// 包括我们的RBAC类
include_once 'Rbac.php';

// 设置数据库连接
$database = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

// 定义RBAC类
$rbac = new Rbac($database);

// 添加用户
$rbac->addUser("user1", "password1", "user1@example.com");
$rbac->addUser("user2", "password2", "user2@example.com");

// 添加角色
$rbac->addRole("admin");
$rbac->addRole("editor");
$rbac->addRole("user");

// 添加权限
$rbac->addPermission("create");
$rbac->addPermission("read");
$rbac->addPermission("update");
$rbac->addPermission("delete");

// 将用户分配给角色
$rbac->assignUserRole(1, 1); // user1 is assigned the admin role
$rbac->assignUserRole(1, 3); // user1 is also assigned the user role
$rbac->assignUserRole(2, 2); // user2 is assigned the editor role

// 将权限分配给角色
$rbac->assignRolePermission(1, 1); // admin role is assigned the create permission
$rbac->assignRolePermission(1, 2); // admin role is assigned the read permission
$rbac->assignRolePermission(1, 3); // admin role is assigned the update permission
$rbac->assignRolePermission(1, 4); // admin role is assigned the delete permission
$rbac->assignRolePermission(3, 2); // user role is assigned the read permission

// 提示测试完成
echo "Test complete!";

Skrip ujian di atas akan melaksanakan sistem kawalan RBAC kami dan akan menambah pengguna, 3 peranan berbeza, 4 kebenaran berbeza, kemudian menugaskan pengguna kepada peranan dan memberikan kebenaran yang diberikan kepada setiap peranan.

Kesimpulan

Dalam artikel ini, kami telah mempelajari cara melaksanakan kawalan akses berasaskan peranan menggunakan PHP dan RBAC. Kami telah membina sistem kawalan RBAC mudah yang boleh menambah pengguna, menambah peranan, menambah kebenaran, menetapkan pengguna kepada peranan dan memberikan kebenaran kepada peranan. Dalam aplikasi praktikal, sistem kawalan RBAC boleh menjadi lebih rutin dan kompleks, yang memerlukan kita mengembangkan dan memperbaikinya mengikut situasi sebenar.

Atas ialah kandungan terperinci Melaksanakan Kawalan Akses Berasaskan Peranan (RBAC): Menggunakan PHP dan RBAC. 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