PHP 怎么PHP 权限界面

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 权限界面

  1. 权限管理核心概念
  2. RBAC权限管理系统实现示例
  3. 使用示例
  4. 最佳实践建议

我来为您详细介绍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 {
    // 无权操作
}

最佳实践建议

  1. 缓存权限数据 - 减少数据库查询
  2. 使用位运算 - 对于简单权限系统
  3. 实现权限继承 - 子角色继承父角色权限
  4. 日志记录 - 记录权限变更操作
  5. 定期审计 - 检查权限分配是否合理

这个完整的权限管理系统包含了用户、角色、权限三个核心元素,可以根据实际需求进行扩展和定制。

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