本文目录导读:

我来详细介绍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:提供创建、更新、删除、查询等完整操作
可以根据具体需求扩展,比如添加角色层级、权限组等功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播