Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierung der rollenbasierten Zugriffskontrolle (RBAC): Verwendung von PHP und RBAC

Implementierung der rollenbasierten Zugriffskontrolle (RBAC): Verwendung von PHP und RBAC

PHPz
PHPzOriginal
2023-06-20 22:39:141440Durchsuche

Angesichts der Beliebtheit von Internetanwendungen hoffen wir, die Daten innerhalb der Anwendung zu schützen, um sicherzustellen, dass sensible Daten nicht missbraucht oder gestohlen werden. Eine der Lösungen ist die Verwendung einer rollenbasierten Zugriffskontrolle (RBAC).

Rollenbasierte Zugriffskontrolle (RBAC) ist ein Zugriffskontrollmodell, das auf der Beziehung zwischen Benutzern und Rollen basiert. Die Kernidee dieses Modells besteht darin, die Rolle des Benutzers mit dem Zugriffskontrollvorgang zu verknüpfen, anstatt den Zugriffskontrollvorgang direkt mit dem Benutzer zu verknüpfen. Dieser Ansatz erhöht die Flexibilität der Zugriffskontrolle und ermöglicht Administratoren eine einfachere Benutzerverwaltung.

In diesem Artikel werden wir PHP und RBAC verwenden, um ein grundlegendes Benutzerzugriffskontrollsystem zu implementieren. Hier sind die Tabellen, die wir verwenden werden:

  • Benutzer: werden zum Speichern der Informationen registrierter Benutzer verwendet.
  • roles: Wird zum Speichern rollenzentrierter Zugriffslisten verwendet.
  • user_roles: werden zum Speichern der Rollen verwendet, denen der Benutzer angehört.
  • Berechtigungen: werden zum Speichern von Berechtigungslisten und Zugriffskontrolllisten verwendet.
  • role_permissions: Wird zum Speichern der Liste der Berechtigungen verwendet, die der Rolle gehören.

Wir werden die folgenden Schritte verwenden, um unser RBAC-Kontrollsystem zu implementieren:

Schritt 1: Erstellen Sie eine Datenbank und richten Sie die zugehörigen Tabellen ein.

Erstellen Sie eine neue Datenbank in der MySQL-Datenbank und richten Sie die folgenden 4 Tabellen ein:

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

Schritt 2: PHP-Code schreiben

Wir werden eine grundlegende PHP-Klasse implementieren, um unser RBAC-Steuerungssystem zu verwalten. In diesem Kurs können wir Benutzer hinzufügen, Rollen hinzufügen, Berechtigungen hinzufügen, Benutzer Rollen zuweisen und Rollen Berechtigungen zuweisen.

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

}

Wir haben jetzt eine einfache Klasse, die Benutzer hinzufügt, Rollen hinzufügt, Berechtigungen hinzufügt, Benutzer Rollen zuweist und Rollen Berechtigungen zuweist.

Schritt 3: Test

Wir können jetzt ein Testskript erstellen, um unser RBAC-Steuerungssystem zu testen. Hier ist der Beispielcode:

// 包括我们的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!";

Das obige Testskript führt unser RBAC-Steuerungssystem aus und fügt einen Benutzer, 3 verschiedene Rollen und 4 verschiedene Berechtigungen hinzu, weist dann den Benutzer der Rolle zu und weist jeder Rolle die Berechtigungen zu.

Fazit

In diesem Artikel haben wir gelernt, wie man eine rollenbasierte Zugriffskontrolle mit PHP und RBAC implementiert. Wir haben ein einfaches RBAC-Kontrollsystem aufgebaut, das Benutzer hinzufügen, Rollen hinzufügen, Berechtigungen hinzufügen, Benutzer Rollen zuweisen und Rollen Berechtigungen zuweisen kann. In praktischen Anwendungen kann das RBAC-Steuerungssystem routinemäßiger und komplexer sein, sodass wir es entsprechend der tatsächlichen Situation erweitern und verbessern müssen.

Das obige ist der detaillierte Inhalt vonImplementierung der rollenbasierten Zugriffskontrolle (RBAC): Verwendung von PHP und RBAC. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn