>  기사  >  백엔드 개발  >  역할 기반 액세스 제어(RBAC) 구현: PHP 및 RBAC 사용

역할 기반 액세스 제어(RBAC) 구현: PHP 및 RBAC 사용

PHPz
PHPz원래의
2023-06-20 22:39:141463검색

인터넷 애플리케이션의 인기에 따라 민감한 데이터가 오용되거나 도난당하지 않도록 애플리케이션 내의 데이터를 보호하고자 합니다. 해결 방법 중 하나는 역할 기반 액세스 제어(RBAC)를 사용하는 것입니다.

RBAC(역할 기반 액세스 제어)는 사용자와 역할 간의 관계를 기반으로 하는 액세스 제어 모델입니다. 이 모델의 핵심 아이디어는 접근 제어 작업을 사용자에게 직접 연결하는 것이 아니라 사용자의 역할을 접근 제어 작업에 연결하는 것입니다. 이 접근 방식은 액세스 제어의 유연성을 높이고 관리자가 사용자를 보다 쉽게 ​​관리할 수 있도록 해줍니다.

이 기사에서는 PHP와 RBAC를 사용하여 기본 사용자 액세스 제어 시스템을 구현하겠습니다. 우리가 사용할 테이블은 다음과 같습니다:

  • users: 등록된 사용자의 정보를 저장하는 데 사용됩니다.
  • roles: 역할 중심 액세스 목록을 저장하는 데 사용됩니다.
  • user_roles: 사용자가 속한 역할을 저장하는 데 사용됩니다.
  • 권한: 권한 목록 및 액세스 제어 목록을 저장하는 데 사용됩니다.
  • 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.