ホームページ  >  記事  >  バックエンド開発  >  ロールベースのアクセス制御 (RBAC) の実装: PHP と RBAC の使用

ロールベースのアクセス制御 (RBAC) の実装: PHP と RBAC の使用

PHPz
PHPzオリジナル
2023-06-20 22:39:141392ブラウズ

インターネット アプリケーションの普及に伴い、機密データが悪用されたり盗まれたりしないように、アプリケーション内のデータを保護したいと考えています。解決策の 1 つは、ロールベースのアクセス制御 (RBAC) を使用することです。

ロールベースのアクセス制御 (RBAC) は、ユーザーとロール間の関係に基づくアクセス制御モデルです。このモデルの中心的な考え方は、アクセス制御操作をユーザーに直接リンクするのではなく、ユーザーの役割をアクセス制御操作にリンクすることです。このアプローチにより、アクセス制御の柔軟性が向上し、管理者がユーザーをより簡単に管理できるようになります。

この記事では、PHP と RBAC を使用して、基本的なユーザー アクセス制御システムを実装します。使用するテーブルは次のとおりです。

  • users: 登録ユーザーに関する情報を保存するために使用されます。
  • roles: ロール中心のアクセス許可リストを保存するために使用されます。
  • user_roles: ユーザーが属するロールを保存するために使用されます。
  • permissions: 許可リストとアクセス制御リストを保存するために使用されます。
  • role_permissions: ロールが所有する権限のリストを保存するために使用されます。

次の手順を使用して RBAC 制御システムを実装します。

ステップ 1: データベースを作成し、それに関連するテーブルを確立します。

MySQL でデータベース 新しいデータベースを作成し、次の 4 つのテーブルを設定します。

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

ステップ 2: PHP コードを記述する

RBAC 制御システムを処理するための基本的な PHP クラスを実装します。このクラスを使用すると、ユーザーの追加、ロールの追加、権限の追加、ユーザーのロールへの割り当て、およびロールへの権限の割り当てを行うことができます。

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

}

これで、ユーザーの追加、ロールの追加、権限の追加、ユーザーのロールへの割り当て、およびロールへの権限の割り当てを行うことができる単純なクラスが完成しました。

ステップ 3: テスト

これで、RBAC 制御システムをテストするためのテスト スクリプトを作成できます。以下はサンプル コードです:

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

上記のテスト スクリプトは RBAC 制御システムを実行し、ユーザー、3 つの異なるロール、4 つの異なる権限を追加し、ユーザーをロールに割り当て、権限を割り当てます。それぞれの役割に割り当てられます。

結論

この記事では、PHP と RBAC を使用してロールベースのアクセス制御を実装する方法を学習しました。ユーザーの追加、ロールの追加、アクセス許可の追加、ユーザーのロールへの割り当て、ロールへのアクセス許可の割り当てを行うことができる、シンプルな RBAC 制御システムを構築しました。実際のアプリケーションでは、RBAC 制御システムはより日常的で複雑になる可能性があるため、実際の状況に応じて拡張および改善する必要があります。

以上がロールベースのアクセス制御 (RBAC) の実装: PHP と RBAC の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。