具有权限的PHP会话

时间:2018-04-25 14:27:14

标签: php

我尝试使用权限创建登录系统。 我想知道如何检查用户的级别,如果它是管理员,技术员等...我已经与用户进行了简单的登录。

这是我的index.php(表格)

<html>
<head>
    <title>Log-In</title>
    <meta charset="UTF-8">
    <meta name="author" content="Augusto Mendes">
    <meta name="description" content="All">
    <link rel="stylesheet" href="styles.css">
</head>
<body id="Both">
    <form id="login" name="form" method="POST" action="/site/base/login_config.php">
        <div class="form">
            <label>Username</label>
            <input type="text" name="username">
        </div>

        <div class="form">
            <label>Password</label>
            <input type="password" name="password">
        </div>

        <div class="form">
            <input type="submit" value="Submit">
        </div>
    </form>
</body>

这是我的login_config.php(登录验证)

<?php
//Gets the Form's Variavels
$user = $_POST["username"];
$pass = $_POST["password"];

//Import "config.php"
include("config.php");

//Check the Data on the Database
$sql = "SELECT * FROM users WHERE User = '$user' AND Password = '$pass'";
$result = mysqli_query($connect, $sql);
$nreg = mysqli_num_rows($result);

if($nreg > 0){ //Check if any of the registries exist - If user exists

    $reg = mysqli_fetch_array($result);
    session_start();
    $_SESSION["User"] = $reg["User"];
    echo "Welcome ".$_SESSION['User'];

    //header('Location:../index.php');
    //I want this to redirect for User or Admin pages with their permissions
}

else{
    //header('Location:../wrong.html');
}
?>

这是我的config.php(连接和数据库)

<?php
// Server COSNTs (Server, User, PW, DB)
define('SERVER', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', '');
define('DATABASE', 'loja');

$connect = mysqli_connect(SERVER, USERNAME, PASSWORD);

// Connection to the MySQL Server
if (!$connect){
    echo " Error: Connection to the Server FAILED! ";
    echo "<script type='text/javascript'>alert(' Error: Connection to the Server FAILED! ')</script>";
    exit;
}

$choose = mysqli_select_db($connect, DATABASE);

// Connection to the Database
if (!$choose){
    echo " Error: Connection to the Database FAILED! ";
    echo "<script type='text/javascript'>alert(' Connection to the Database FAILED! ')</script>";
    exit;       
}
?>

Image of the database

0:Windows技术员 1:Apple技术员 2:商店经理 3:管理员 4:现在N / D

由于我有2个文件夹,一个用户(0,1,2)和admin(3),我想只为每个用户提供权限。管理员可以访问用户&#39;数据但不是他们的文件夹和用户无法访问管理员。

感谢阅读。 -Ryan

1 个答案:

答案 0 :(得分:0)

注意:为了解相关问题,我将回答这个问题,请注意,此代码可能会受到严重的安全攻击,例如{{3} },SQL injection ...

我完全建议不要在生产环境中使用任何这些

安全性是一个棘手的话题,我建议使用一些库或框架进行登录,并确保其配置正确并且(合理)安全

回答:您基本上必须检查行“角色”中的值,并确定将其发送到何处。您还可以将整个用户信息存储在会话中而不仅仅是用户名中,这样您就可以检查每个页面上的权限

const ADMIN_ROLE = 4;

if($nreg > 0){ //Check if any of the registries exist - If user exists

    $reg = mysqli_fetch_array($result);
    session_start();

    // Store the whole user information
    $_SESSION['LoggedUser'] = $reg;

    // Note: as you redirect after with the header location the user won't really see this message 
    echo "Welcome ".$_SESSION['LoggedUser']['User'];

    // Set a default page for normal users
    $page = '../index.php';

    // Check against the admin role and overwrite
    if ($_SESSION['LoggedUser']['Role'] == ADMIN_ROLE) {
        $page = '../admin/index.php';
    }

    header("Location: $page");
}

回答评论 您可以使用常量

创建一个类
class Role
{
    const WINDOWS = 0;
    const APPLE   = 1;
    const MANAGER = 2;
    const ADMIN   = 3;
}

现在,您可以在需要时使用此文件

// It's better to use some autoloading, look at "composer"
include "./Role.php";

session_start();
//... do checks

if (!$_SESSION['LoggedUser']['Role'] != Role::ADMIN) {
    // redirect
}

我不太喜欢公共常量,我认为将这个逻辑封装在类中是一种更好的做法,因此可以从外部隐藏常量。我不打算扩展它,但你最终会得到像

这样的东西
if (!$user->getRole()->isAdmin()) {
    // redirect
}