本文目录导读:

我来为您详细介绍PHP权限界面的设计和实现方法,权限管理系统是Web应用的重要组成部分。
权限管理核心概念
常见的权限模型
- RBAC (基于角色的访问控制) - 最常用
- ACL (访问控制列表)
- ABAC (基于属性的访问控制)
RBAC权限管理系统实现示例
数据库表结构
-- 用户表 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(100) DEFAULT NULL, `status` tinyint(1) DEFAULT '1', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ); -- 角色表 CREATE TABLE `roles` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `description` varchar(255) DEFAULT NULL, `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ); -- 用户角色关联表 CREATE TABLE `user_roles` ( `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 `roles` (`id`) ); -- 权限表 CREATE TABLE `permissions` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `slug` varchar(100) NOT NULL, `description` varchar(255) DEFAULT NULL, `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `slug` (`slug`) ); -- 角色权限关联表 CREATE TABLE `role_permissions` ( `role_id` int(11) NOT NULL, `permission_id` int(11) NOT NULL, PRIMARY KEY (`role_id`,`permission_id`), FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`), FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) );
权限管理类
<?php
class PermissionManager {
private $db;
public function __construct($db) {
$this->db = $db;
}
// 检查用户是否有权限
public function hasPermission($userId, $permissionSlug) {
$sql = "SELECT COUNT(*) as count
FROM user_roles ur
JOIN role_permissions rp ON ur.role_id = rp.role_id
JOIN permissions p ON rp.permission_id = p.id
WHERE ur.user_id = :user_id AND p.slug = :slug";
$stmt = $this->db->prepare($sql);
$stmt->execute([
':user_id' => $userId,
':slug' => $permissionSlug
]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return $result['count'] > 0;
}
// 获取用户所有权限
public function getUserPermissions($userId) {
$sql = "SELECT p.*
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 = :user_id";
$stmt = $this->db->prepare($sql);
$stmt->execute([':user_id' => $userId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 添加角色
public function createRole($name, $description = '') {
$sql = "INSERT INTO roles (name, description) VALUES (:name, :description)";
$stmt = $this->db->prepare($sql);
return $stmt->execute([
':name' => $name,
':description' => $description
]);
}
// 分配角色给用户
public function assignRoleToUser($userId, $roleId) {
$sql = "INSERT INTO user_roles (user_id, role_id) VALUES (:user_id, :role_id)";
$stmt = $this->db->prepare($sql);
return $stmt->execute([
':user_id' => $userId,
':role_id' => $roleId
]);
}
// 为角色分配权限
public function assignPermissionToRole($roleId, $permissionId) {
$sql = "INSERT INTO role_permissions (role_id, permission_id)
VALUES (:role_id, :permission_id)";
$stmt = $this->db->prepare($sql);
return $stmt->execute([
':role_id' => $roleId,
':permission_id' => $permissionId
]);
}
}
权限检查中间件
<?php
class PermissionMiddleware {
private $permissionManager;
public function __construct($permissionManager) {
$this->permissionManager = $permissionManager;
}
// 检查权限中间件
public function checkPermission($permissionSlug) {
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}
$userId = $_SESSION['user_id'];
if (!$this->permissionManager->hasPermission($userId, $permissionSlug)) {
// 无权限处理
header('HTTP/1.1 403 Forbidden');
echo json_encode(['error' => '权限不足']);
exit;
}
}
// 检查多个权限(任意一个)
public function checkAnyPermission($permissions) {
$userId = $_SESSION['user_id'];
$userPermissions = $this->permissionManager->getUserPermissions($userId);
foreach ($permissions as $permission) {
if (in_array($permission, array_column($userPermissions, 'slug'))) {
return true;
}
}
return false;
}
}
权限界面模板
<?php
// user_permissions.php - 用户权限管理界面
session_start();
require_once 'PermissionManager.php';
require_once 'PermissionMiddleware.php';
// 初始化数据库连接
$db = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
$permissionManager = new PermissionManager($db);
$middleware = new PermissionMiddleware($permissionManager);
// 检查是否有管理权限
$middleware->checkPermission('manage_permissions');
// 获取所有用户
$users = $db->query("SELECT * FROM users")->fetchAll();
// 获取所有角色
$roles = $db->query("SELECT * FROM roles")->fetchAll();
// 获取所有权限
$permissions = $db->query("SELECT * FROM permissions")->fetchAll();
?>
<!DOCTYPE html>
<html>
<head>权限管理系统</title>
<style>
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.section {
margin-bottom: 30px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}
.section h2 {
margin-top: 0;
color: #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 15px;
}
th, td {
padding: 10px;
border: 1px solid #ddd;
text-align: left;
}
th {
background-color: #f5f5f5;
}
.btn {
display: inline-block;
padding: 8px 16px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
text-decoration: none;
}
.btn:hover {
background-color: #0056b3;
}
.permission-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 10px;
}
.permission-item {
padding: 10px;
background: #f9f9f9;
border: 1px solid #eee;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="container">
<h1>权限管理系统</h1>
<!-- 用户角色分配 -->
<div class="section">
<h2>用户角色管理</h2>
<table>
<thead>
<tr>
<th>用户</th>
<th>当前角色</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo htmlspecialchars($user['username']); ?></td>
<td>
<?php
$userRoles = $db->prepare("
SELECT r.name FROM roles r
JOIN user_roles ur ON r.id = ur.role_id
WHERE ur.user_id = :user_id
");
$userRoles->execute([':user_id' => $user['id']]);
$roles = $userRoles->fetchAll(PDO::FETCH_COLUMN);
echo implode(', ', $roles) ?: '暂无角色';
?>
</td>
<td>
<form method="POST" action="assign_role.php">
<input type="hidden" name="user_id" value="<?php echo $user['id']; ?>">
<select name="role_id">
<option value="">选择角色</option>
<?php foreach ($roles as $role): ?>
<option value="<?php echo $role['id']; ?>">
<?php echo htmlspecialchars($role['name']); ?>
</option>
<?php endforeach; ?>
</select>
<button type="submit" class="btn">分配</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- 角色权限分配 -->
<div class="section">
<h2>角色权限管理</h2>
<form method="POST" action="assign_permissions.php">
<label>选择角色:</label>
<select name="role_id" onchange="this.form.submit()">
<option value="">请选择</option>
<?php foreach ($roles as $role): ?>
<option value="<?php echo $role['id']; ?>">
<?php echo htmlspecialchars($role['name']); ?>
</option>
<?php endforeach; ?>
</select>
<div class="permission-grid">
<?php foreach ($permissions as $permission): ?>
<div class="permission-item">
<label>
<input type="checkbox" name="permissions[]"
value="<?php echo $permission['id']; ?>"
<?php
// 检查是否已分配
$sql = "SELECT COUNT(*) FROM role_permissions
WHERE role_id = ? AND permission_id = ?";
$stmt = $db->prepare($sql);
$stmt->execute([$_POST['role_id'] ?? 0, $permission['id']]);
if ($stmt->fetchColumn() > 0) echo 'checked';
?>>
<?php echo htmlspecialchars($permission['name']); ?>
</label>
<small><?php echo htmlspecialchars($permission['description']); ?></small>
</div>
<?php endforeach; ?>
</div>
<button type="submit" class="btn" style="margin-top: 15px;">保存权限</button>
</form>
</div>
<!-- 添加新角色 -->
<div class="section">
<h2>添加新角色</h2>
<form method="POST" action="create_role.php">
<div style="margin-bottom: 10px;">
<label>角色名称:</label>
<input type="text" name="role_name" required>
</div>
<div style="margin-bottom: 10px;">
<label>角色描述:</label>
<textarea name="description" rows="3"></textarea>
</div>
<button type="submit" class="btn">创建角色</button>
</form>
</div>
</div>
</body>
</html>
使用示例
<?php
// 在需要权限控制的页面中使用
require_once 'PermissionMiddleware.php';
$middleware = new PermissionMiddleware($permissionManager);
// 检查单个权限
$middleware->checkPermission('create_post');
// 或者用条件判断
if ($middleware->hasPermission($userId, 'edit_post')) {
// 允许编辑
} else {
// 无权操作
}
最佳实践建议
- 缓存权限数据 - 减少数据库查询
- 使用位运算 - 对于简单权限系统
- 实现权限继承 - 子角色继承父角色权限
- 日志记录 - 记录权限变更操作
- 定期审计 - 检查权限分配是否合理
这个完整的权限管理系统包含了用户、角色、权限三个核心元素,可以根据实际需求进行扩展和定制。