温馨提示×

layui php如何实现用户权限管理

PHP
小樊
81
2024-12-06 23:50:43
栏目: 编程语言

在Layui框架中结合PHP实现用户权限管理通常涉及以下几个步骤:

  1. 数据库设计:首先需要设计一个数据库来存储用户信息、角色信息和权限信息。常见的表结构可能包括:

    • users 表:存储用户的基本信息(如用户名、密码等)。
    • roles 表:存储角色信息(如角色名、描述等)。
    • permissions 表:存储权限信息(如权限名、描述等)。
    • role_user 表:存储用户和角色的关联关系。
    • permission_role 表:存储角色和权限的关联关系。
  2. 用户认证:使用Layui的表单验证和AJAX请求来实现用户的登录和注册功能。登录成功后,根据用户的角色信息生成一个权限列表。

  3. 权限检查:在需要权限控制的页面或操作中,使用PHP和Layui的AJAX请求来检查用户是否拥有相应的权限。

以下是一个简单的示例代码,展示了如何实现这些步骤:

1. 数据库设计

假设你已经创建了一个名为 my_database 的数据库,并且有以下表结构:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `description` text,
  PRIMARY KEY (`id`)
);

CREATE TABLE `permissions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `description` text,
  PRIMARY KEY (`id`)
);

CREATE TABLE `role_user` (
  `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 `permission_role` (
  `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`)
);

2. 用户认证

创建一个登录页面 login.php,使用Layui的表单验证和AJAX请求来实现用户的登录功能。

<?php
// 连接数据库
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 处理登录请求
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // 验证用户名和密码
    $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $user = $result->fetch_assoc();
        session(['user_id' => $user['id'], 'username' => $user['username']]);
        echo json_encode(['status' => 'success', 'message' => '登录成功']);
    } else {
        echo json_encode(['status' => 'error', 'message' => '用户名或密码错误']);
    }
}

$conn->close();
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>登录</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layui@2.6.8/dist/css/layui.css" media="all">
</head>
<body>

<form class="layui-form" action="">
    <div class="layui-form-item">
        <label class="layui-form-label">用户名</label>
        <div class="layui-input-block">
            <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">密码</label>
        <div class="layui-input-block">
            <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="login">登录</button>
        </div>
    </div>
</form>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/layui@2.6.8/dist/layui.all.js"></script>
<script>
layui.use(['form'], function(){
    var form = layui.form;

    // 监听提交
    form.on('submit(login)', function(data){
        var field = data.field;

        // 发起AJAX请求
        layui.$.post('/login', field, function(res){
            if (res.status === 'success') {
                alert(res.message);
                // 登录成功后跳转到主页
                window.location.href = '/home';
            } else {
                alert(res.message);
            }
        });
        return false;
    });
});
</script>

</body>
</html>

3. 权限检查

创建一个主页 home.php,使用Layui的AJAX请求来检查用户是否拥有相应的权限。

<?php
// 连接数据库
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 获取用户信息
session_start();
$user_id = $_SESSION['user_id'];
$username = $_SESSION['username'];

// 检查用户是否拥有权限
$sql = "SELECT p.* FROM permissions p JOIN permission_role pr ON p.id = pr.permission_id JOIN role_user ru ON pr.role_id = ru.role_id WHERE ru.user_id = $user_id";
$result = $conn->query($sql);
$permissions = [];
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $permissions[] = $row['name'];
    }
}

$conn->close();
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>主页</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layui@2.6.8/dist/css/layui.css" media="all">
</head>
<body>

<h1>欢迎,<?php echo $username; ?>!</h1>

<div class="layui-card">
    <div class="layui-card-header">权限检查</div>
    <div class="layui-card-body">
        <ul>
            <?php foreach ($permissions as $permission): ?>
                <li<?php if (in_array($permission, ['admin', 'editor'])): ?> class="layui-btn layui-btn-normal"<?php else: ?> class="layui-btn layui-btn-disabled"<?php endif; ?>>
                    <?php echo $permission; ?>
                </li>
            <?php endforeach; ?>
        </ul>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/layui@2.6.8/dist/layui.all.js"></script>
<script>
layui.use(['form'], function(){
    var form = layui.form;

    // 检查权限
    layui.$.get('/check_permission?username=<?php echo $username; ?>', function(res){
        if (res.status === 'success') {
            var permissions = res.data;
            var content = '';
            permissions.forEach(function(permission) {
                content += '<li' + (in_array(permission, ['admin', 'editor']) ? ' class="layui-btn layui-btn-normal"' : ' class="layui-btn layui-btn-disabled"') + '>' + permission + '</li>';
            });
            $('.layui-card-body ul').html(content);
        } else {
            alert('权限检查失败');
        }
    });
});
</script>

</body>
</html>

4. 检查权限的PHP代码

创建一个 check_permission.php 文件来处理权限检查请求。

<?php
// 连接数据库
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 获取用户信息
session_start();
$user_id = $_SESSION['user_id'];
$username = $_GET['username'];

// 检查用户是否拥有权限
$sql = "SELECT p.* FROM permissions p JOIN permission_role pr ON p.id = pr.permission_id JOIN role_user ru ON pr.role_id = ru.role_id WHERE ru.user_id = $user_id";
$result = $conn->query($sql);
$permissions = [];
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $permissions[] = $row['name'];
    }
}

$conn->close();

// 返回权限列表
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'data' => $permissions]);
?>

通过以上步骤,你可以在Layui框架中结合PHP实现基本的用户权限管理功能。根据实际需求,你可以进一步扩展和优化这些代码。

0