PHP 怎么PHP 用户角色管理

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 用户角色管理

  1. 数据库设计
  2. 基础角色管理类
  3. 权限检查中间件
  4. 使用示例
  5. RBAC(基于角色的访问控制)高级实现
  6. 前端界面示例

我来详细介绍PHP用户角色管理的实现方案:

数据库设计

用户表 (users)

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    status TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 角色表
CREATE TABLE roles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) UNIQUE NOT NULL,
    description VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 权限表
CREATE TABLE permissions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) UNIQUE NOT NULL,
    description VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 用户-角色关联表
CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);
-- 角色-权限关联表
CREATE TABLE role_permissions (
    role_id INT,
    permission_id INT,
    PRIMARY KEY (role_id, permission_id),
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);

基础角色管理类

PermissionManager.php

<?php
class PermissionManager {
    private $db;
    public function __construct($db) {
        $this->db = $db;
    }
    // 获取用户的所有角色
    public function getUserRoles($userId) {
        $stmt = $this->db->prepare(
            "SELECT r.* FROM roles r 
             JOIN user_roles ur ON r.id = ur.role_id 
             WHERE ur.user_id = ?"
        );
        $stmt->execute([$userId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    // 获取角色的所有权限
    public function getRolePermissions($roleId) {
        $stmt = $this->db->prepare(
            "SELECT p.* FROM permissions p 
             JOIN role_permissions rp ON p.id = rp.permission_id 
             WHERE rp.role_id = ?"
        );
        $stmt->execute([$roleId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    // 获取用户的所有权限
    public function getUserPermissions($userId) {
        $stmt = $this->db->prepare(
            "SELECT DISTINCT p.name 
             FROM permissions p
             JOIN role_permissions rp ON p.id = rp.permission_id
             JOIN user_roles ur ON rp.role_id = ur.role_id
             WHERE ur.user_id = ?"
        );
        $stmt->execute([$userId]);
        return $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
    }
    // 检查用户是否有特定权限
    public function hasPermission($userId, $permissionName) {
        $permissions = $this->getUserPermissions($userId);
        return in_array($permissionName, $permissions);
    }
    // 为用户分配角色
    public function assignRole($userId, $roleId) {
        $stmt = $this->db->prepare(
            "INSERT IGNORE INTO user_roles (user_id, role_id) VALUES (?, ?)"
        );
        return $stmt->execute([$userId, $roleId]);
    }
    // 从用户移除角色
    public function removeRole($userId, $roleId) {
        $stmt = $this->db->prepare(
            "DELETE FROM user_roles WHERE user_id = ? AND role_id = ?"
        );
        return $stmt->execute([$userId, $roleId]);
    }
    // 为角色分配权限
    public function assignPermission($roleId, $permissionId) {
        $stmt = $this->db->prepare(
            "INSERT IGNORE INTO role_permissions (role_id, permission_id) VALUES (?, ?)"
        );
        return $stmt->execute([$roleId, $permissionId]);
    }
}

RoleManager.php

<?php
class RoleManager {
    private $db;
    public function __construct($db) {
        $this->db = $db;
    }
    // 创建角色
    public function createRole($name, $description = '') {
        $stmt = $this->db->prepare(
            "INSERT INTO roles (name, description) VALUES (?, ?)"
        );
        return $stmt->execute([$name, $description]);
    }
    // 更新角色
    public function updateRole($roleId, $name, $description) {
        $stmt = $this->db->prepare(
            "UPDATE roles SET name = ?, description = ? WHERE id = ?"
        );
        return $stmt->execute([$name, $description, $roleId]);
    }
    // 删除角色
    public function deleteRole($roleId) {
        // 先删除关联
        $this->db->prepare("DELETE FROM user_roles WHERE role_id = ?")->execute([$roleId]);
        $this->db->prepare("DELETE FROM role_permissions WHERE role_id = ?")->execute([$roleId]);
        // 删除角色
        $stmt = $this->db->prepare("DELETE FROM roles WHERE id = ?");
        return $stmt->execute([$roleId]);
    }
    // 获取所有角色
    public function getAllRoles() {
        $stmt = $this->db->query("SELECT * FROM roles ORDER BY name");
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    // 获取单个角色
    public function getRole($roleId) {
        $stmt = $this->db->prepare("SELECT * FROM roles WHERE id = ?");
        $stmt->execute([$roleId]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}

权限检查中间件

AuthMiddleware.php

<?php
class AuthMiddleware {
    private $permissionManager;
    public function __construct($permissionManager) {
        $this->permissionManager = $permissionManager;
    }
    // 检查权限中间件
    public function requirePermission($permissionName) {
        return function($request) use ($permissionName) {
            $userId = $_SESSION['user_id'] ?? null;
            if (!$userId) {
                header('HTTP/1.1 401 Unauthorized');
                echo json_encode(['error' => '未登录']);
                exit;
            }
            if (!$this->permissionManager->hasPermission($userId, $permissionName)) {
                header('HTTP/1.1 403 Forbidden');
                echo json_encode(['error' => '没有权限']);
                exit;
            }
            return true;
        };
    }
    // 检查角色中间件
    public function requireRole($roleName) {
        return function($request) use ($roleName) {
            $userId = $_SESSION['user_id'] ?? null;
            if (!$userId) {
                header('HTTP/1.1 401 Unauthorized');
                exit;
            }
            $roles = $this->permissionManager->getUserRoles($userId);
            $roleNames = array_column($roles, 'name');
            if (!in_array($roleName, $roleNames)) {
                header('HTTP/1.1 403 Forbidden');
                echo json_encode(['error' => '需要特定角色']);
                exit;
            }
            return true;
        };
    }
}

使用示例

index.php

<?php
require_once 'PermissionManager.php';
require_once 'RoleManager.php';
require_once 'AuthMiddleware.php';
// 初始化数据库连接
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 初始化管理器
$permissionManager = new PermissionManager($db);
$roleManager = new RoleManager($db);
$authMiddleware = new AuthMiddleware($permissionManager);
// 创建角色和权限示例
if ($_GET['action'] === 'setup') {
    // 创建权限
    $db->exec("INSERT INTO permissions (name, description) VALUES 
        ('user.create', '创建用户'),
        ('user.edit', '编辑用户'),
        ('user.delete', '删除用户'),
        ('admin.access', '访问管理后台')
    ");
    // 创建角色
    $roleManager->createRole('admin', '管理员');
    $roleManager->createRole('editor', '编辑者');
    $roleManager->createRole('viewer', '查看者');
    // 为管理员分配所有权限
    $permissionManager->assignPermission(1, 1); // admin 有 user.create
    $permissionManager->assignPermission(1, 2); // admin 有 user.edit
    $permissionManager->assignPermission(1, 3); // admin 有 user.delete
    $permissionManager->assignPermission(1, 4); // admin 有 admin.access
    // 为编辑者分配部分权限
    $permissionManager->assignPermission(2, 1); // editor 有 user.create
    $permissionManager->assignPermission(2, 2); // editor 有 user.edit
    echo "角色和权限设置完成!";
    exit;
}
// 检查用户权限
session_start();
$_SESSION['user_id'] = 1; // 模拟用户登录
if ($_GET['action'] === 'check') {
    $userId = $_SESSION['user_id'];
    echo "用户角色:\n";
    $roles = $permissionManager->getUserRoles($userId);
    foreach ($roles as $role) {
        echo "- {$role['name']}: {$role['description']}\n";
    }
    echo "\n用户权限:\n";
    $permissions = $permissionManager->getUserPermissions($userId);
    foreach ($permissions as $perm) {
        echo "- $perm\n";
    }
    echo "\n特定权限检查:\n";
    echo "是否有创建用户权限:" . ($permissionManager->hasPermission($userId, 'user.create') ? '是' : '否') . "\n";
    echo "是否有删除用户权限:" . ($permissionManager->hasPermission($userId, 'user.delete') ? '是' : '否') . "\n";
}

RBAC(基于角色的访问控制)高级实现

RbacService.php

<?php
class RbacService {
    private $db;
    private $cache = [];
    public function __construct($db) {
        $this->db = $db;
    }
    // 缓存用户权限
    public function cacheUserPermissions($userId) {
        if (!isset($this->cache[$userId])) {
            $this->cache[$userId] = $this->getUserPermissions($userId);
        }
        return $this->cache[$userId];
    }
    // 批量分配角色给用户
    public function assignRolesToUser($userId, array $roleIds) {
        $this->db->beginTransaction();
        try {
            // 删除现有角色
            $this->db->prepare("DELETE FROM user_roles WHERE user_id = ?")->execute([$userId]);
            // 分配新角色
            $stmt = $this->db->prepare("INSERT INTO user_roles (user_id, role_id) VALUES (?, ?)");
            foreach ($roleIds as $roleId) {
                $stmt->execute([$userId, $roleId]);
            }
            $this->db->commit();
            return true;
        } catch (Exception $e) {
            $this->db->rollBack();
            return false;
        }
    }
    // 批量分配权限给角色
    public function assignPermissionsToRole($roleId, array $permissionIds) {
        $this->db->beginTransaction();
        try {
            // 删除现有权限
            $this->db->prepare("DELETE FROM role_permissions WHERE role_id = ?")->execute([$roleId]);
            // 分配新权限
            $stmt = $this->db->prepare("INSERT INTO role_permissions (role_id, permission_id) VALUES (?, ?)");
            foreach ($permissionIds as $permissionId) {
                $stmt->execute([$roleId, $permissionId]);
            }
            $this->db->commit();
            return true;
        } catch (Exception $e) {
            $this->db->rollBack();
            return false;
        }
    }
    // 获取所有用户及其角色
    public function getUsersWithRoles() {
        $stmt = $this->db->query(
            "SELECT u.id, u.username, GROUP_CONCAT(r.name) as roles
             FROM users u
             LEFT JOIN user_roles ur ON u.id = ur.user_id
             LEFT JOIN roles r ON ur.role_id = r.id
             GROUP BY u.id, u.username"
        );
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

前端界面示例

admin/users.php

<?php
// 简单的用户角色管理页面
session_start();
// 检查管理员权限
if (!isset($_SESSION['user_id'])) {
    header('Location: /login.php');
    exit;
}
$userId = $_SESSION['user_id'];
$permissionManager = new PermissionManager($db);
if (!$permissionManager->hasPermission($userId, 'admin.access')) {
    header('HTTP/1.1 403 Forbidden');
    echo "没有权限访问管理后台";
    exit;
}
?>
<!DOCTYPE html>
<html>
<head>用户角色管理</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <h1>用户角色管理</h1>
        <!-- 用户列表 -->
        <table class="table">
            <thead>
                <tr>
                    <th>用户</th>
                    <th>角色</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <?php
                $rbacService = new RbacService($db);
                $users = $rbacService->getUsersWithRoles();
                foreach ($users as $user) {
                    echo "<tr>";
                    echo "<td>" . htmlspecialchars($user['username']) . "</td>";
                    echo "<td>" . htmlspecialchars($user['roles'] ?? '无角色') . "</td>";
                    echo "<td>
                            <button class='btn btn-sm btn-primary' onclick='editRoles({$user['id']})'>编辑角色</button>
                          </td>";
                    echo "</tr>";
                }
                ?>
            </tbody>
        </table>
        <!-- 角色管理 -->
        <h2>角色配置</h2>
        <form method="post" action="manage_roles.php">
            <div class="mb-3">
                <label>角色名称</label>
                <input type="text" name="role_name" class="form-control" required>
            </div>
            <button type="submit" class="btn btn-primary">创建角色</button>
        </form>
    </div>
</body>
</html>

这个系统提供了完整的用户角色管理解决方案,包括:

  1. 灵活的权限系统:支持细粒度的权限控制
  2. 角色继承:通过多对多关系实现复杂的角色权限映射
  3. 缓存机制:提高权限检查性能
  4. 中间件支持:方便在路由层面控制访问权限
  5. 完整的API:提供创建、更新、删除、查询等完整操作

可以根据具体需求扩展,比如添加角色层级、权限组等功能。

抱歉,评论功能暂时关闭!