本文目录导读:

我来详细介绍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>
这个系统提供了完整的用户角色管理解决方案,包括:
- 灵活的权限系统:支持细粒度的权限控制
- 角色继承:通过多对多关系实现复杂的角色权限映射
- 缓存机制:提高权限检查性能
- 中间件支持:方便在路由层面控制访问权限
- 完整的API:提供创建、更新、删除、查询等完整操作
可以根据具体需求扩展,比如添加角色层级、权限组等功能。