📜  为用户分配角色 - PHP (1)

📅  最后修改于: 2023-12-03 15:36:01.537000             🧑  作者: Mango

为用户分配角色 - PHP

在 Web 应用程序中,通常需要对不同类型和级别的用户授予不同的用户角色,以便限制其访问权限。在 PHP 中分配用户角色的方法有很多种,以下是其中一种基于数据库存储的实现方法。

数据库设计

在数据库中,通常需要创建三个基本表:

  1. 用户表:用于存储用户的基本信息,如用户名、密码、电子邮件地址等。

    CREATE TABLE users (
        id INT(11) PRIMARY KEY auto_increment,
        username VARCHAR(50) NOT NULL UNIQUE,
        email VARCHAR(255) NOT NULL UNIQUE,
        password CHAR(60) NOT NULL
    );
    
  2. 角色表:用于存储角色的基本信息,如角色名称、描述等。

    CREATE TABLE user_roles (
        id INT(11) PRIMARY KEY auto_increment,
        name VARCHAR(50) NOT NULL UNIQUE,
        description VARCHAR(255) NOT NULL
    );
    
  3. 用户角色关系表:用于存储每个用户和其对应角色之间的关系。

    CREATE TABLE user_role_relationships (
        user_id INT(11) NOT NULL,
        role_id INT(11) NOT NULL,
        PRIMARY KEY (user_id, role_id),
        FOREIGN KEY (user_id) REFERENCES users(id),
        FOREIGN KEY (role_id) REFERENCES user_roles(id)
    );
    

以上是最基本的数据库设计,根据实际需求可以增加一些其他的表和字段。

分配用户角色

下面是一个实现分配用户角色的 PHP 函数:

/**
 * 分配用户角色
 *
 * @param int $user_id 用户 ID
 * @param int[] $role_ids 角色 ID 数组
 * @return bool 是否成功分配角色
 */
function assignUserRoles($user_id, $role_ids) {
    // 1. 连接数据库
    $connection = new mysqli("hostname", "username", "password", "dbname");
    if ($connection->connect_error) {
        die("连接数据库失败:" . $connection->connect_error);
    }

    // 2. 删除用户的所有角色
    $delete_stmt = $connection->prepare("DELETE FROM user_role_relationships WHERE user_id = ?");
    $delete_stmt->bind_param("i", $user_id);
    if (!$delete_stmt->execute()) {
        die("删除用户角色失败:" . $delete_stmt->error);
    }

    // 3. 添加用户的新角色
    $insert_stmt = $connection->prepare("INSERT INTO user_role_relationships (user_id, role_id) VALUES (?, ?)");
    foreach ($role_ids as $role_id) {
        $insert_stmt->bind_param("ii", $user_id, $role_id);
        if (!$insert_stmt->execute()) {
            die("添加用户角色失败:" . $insert_stmt->error);
        }
    }

    // 4. 关闭数据库连接
    $connection->close();

    return true;
}

该函数接受用户 ID 和角色 ID 数组作为参数,首先连接数据库,然后删除该用户之前拥有的所有角色,并添加新的角色。可以看到,通过准备语句和绑定参数的方式,该函数能够避免 SQL 注入攻击。

小结

以上是一种基于数据库存储的用户角色分配实现方法,该方法可以灵活地实现不同权限级别的用户管理。分配用户角色时需要注意安全性问题,如防止 SQL 注入等。