使用 php 在导航菜单中设置文件权限

Set file privileges in navigational menu with php

您好,感谢您的提前帮助。我正在开发一个更强大的版本,但我需要一些短期的东西。我们创建了一个 2 层用户访问管理面板。员工和管理员。下面的代码是我们在短期内实施的较长版本的简短版本示例。首先我想检查他们的访问级别是 1 级还是 0 级。这是 OOP 中的一种方法。

    function menuPriviledge($dbCon){

        $username = $_REQUEST['username'];

        if($accessLevel = $this->dbConnection->query("SELECT access FROM UserProfiles WHERE username = '$username' LIMIT 0, 1")){
            while($accessData = $accessLevel->fetch_assoc()){
                $access = $accessData['access'];
            }
        }

在我完成回显此顶部部分后,我得到了正确的答案,我得到了与帐户中当前用户名相关联的访问级别 1。这就是我一直在寻找的,所以我们很好,但是在下一个 if 语句中,我测试变量 $access = 为 1(下面的语句)如果它等于 1,我调用 printf 并显示当前列表为管理员准备的导航菜单,否则会为页面访问受限的员工显示不同的预设菜单。

            if(isset($access)){

                switch($access){

                case 1: 
                    $query = "SELECT * FROM CVCUserFilePrivileges";
                    if($files = $this->dbConnection->query($query)){
                        while($access = $files->fetch_assoc()){
                            printf("<li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Directory Listings</a></li>
                                <li><a title=\"Ads Manager\"><i class=\"icon-laptop\"></i>Ads Manager<span>5</span></a>
                                    <ul>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Dealer Paid Listings</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Listing Side Ads</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Scrap Metal Page Ads</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Coin Request Page Ads</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Dealer Form Page Ads</a></li>
                                    </ul>                   
                                </li>", $access['directoryList'], $access['dlrPaidListing'], $access['listingSideAds'], $access['scrapMetalAds'], $access['coinRequestAds'], $access['dlrFormAds']);
                        }
                    }
                break;
                case 0:
                    $query = "SELECT * FROM CVCUserFilePrivileges";
                    if($files = $this->dbConnection->query($query)){
                        while($access = $files->fetch_assoc()){
                            printf("<li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Directory Listings</a></li>
                                <li><a title=\"Ads Manager\"><i class=\"icon-laptop\"></i>Ads Manager<span>1</span></a>
                                    <ul>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Dealer Paid Listings</a></li>
                                    </ul>                   
                                </li>", $access['directory'], $access['dlrPaidListing']);
                        }
                    }
                break;
                default:
                    echo "There is an error, no access level set, contact your database administrator";
                }
            }

当它半工作时,它会继续将第一页 link 添加到其下方的每个导航选项,因此每个导航选项都指向同一页面。当它不起作用时,它就会完全消失,导航甚至不存在。我希望我能够很好地解释这一点。问题似乎出在我在显示导航菜单之前测试他们的访问级别的 if 语句上。

将代码更改为:

if(isset($access)) {

    switch($access) {

        case 1:
           // do the code
           break;

        case 2:
           // do the code
           break;

    }
}else{
    echo "access not set";
}

试试这个。

Ps.: 1 不同于“1”。您是否将 sql 字段设为 int?

为了在保护页面的同时充分发挥作用,我添加了这个简单的代码来存储在登录过程中登录的当前用户名

        session_start();
            $_SESSION['username'] = $user;

然后我添加了一个包含类似以下语法的包含文件。

session_start();
if(isset($_SESSION['username'])){
    $userId = $_SESSION['username'];
} else {
    echo "You don't have credentials to enter...";
    exit();
    die();
}

此包含已添加到所有文件中,或者我还可以选择将所有页面中的通用包含文件包含到包含所有通用 include() 的包含文件中;文件。现在它限制访问,除非有人登录,但如果有人有更好的优化此代码的方法,请告诉我。我认为这个版本简单轻便。任何人都可以推荐任何额外的安全级别,请随时告诉我。其他人可能也可以使用它。

现在根据 $userId 中存储的用户名,它将提供正确的菜单。

菜单的语法如下所示。

class menu{

    public function __construct($dbCon){
        $this->dbConn = $dbCon;
    }

    function menuPriviledges($dbCon){

        global $userId;

            if($accessLev = $this->dbConn->query("SELECT access FROM UserProfiles WHERE userId = '$userId'")){
                while($Data = $accessLev->fetch_assoc()){
                    $access = $Data['access'];
                }
            }

            if($access == 1){
                include('common-menu-admin.php');
            } elseif($access == 0) {
                include('common-menu-employee.php');
            }

    }
}

现在一切正常而且速度也很快!