基于用户角色的动态php页面

时间:2016-12-06 19:53:18

标签: php mysql

我已经使用我的数据库设计进入十字路口,并认为它存在缺陷,但希望有人可以提供帮助,因为我已经进入构建阶段了。

表格:

**users**
user_id  | user_email      | user_role | dashboard_id
1        | admin@admin.com | 0         | 1
2        | user@user.com   | 1         | 2
---------------------------------------------------

**dashboards**
dashboard_id | dashboard_name | 
1            | dashboard 1
2            | dashboard 2
---------------------------------------------------

**roles**
role_id | role_name | 
0       | super_admin
1       | user
---------------------------------------------------

Superadmins:他们登录并进入顶级页面,在那里他们可以创建一个新的仪表板。

用户:可以登录并转到他们所关联的仪表板。

Superadmins:能够点击仪表板并查看该仪表板,但正如您所见,它们也被绑定到仪表板。

现在,我通过在会话中获取用户ID并在dashboard_id中从users表中获取值来显示仪表板上的信息,并将其匹配如下:

function clientReportName() {
global $conn;
global $dashboardIdNew;
global $user_dash_id;

    $sql = "SELECT * FROM dashboards WHERE dashboard_id = $user_dash_id";
    $result = $conn->query($sql);

    if($result->num_rows > 0){
        while($row = $result->fetch_assoc()){
            echo $row["dashboard_name"];        
        }
    }
}

上面的内容为我提供了与之关联的仪表板的标题。

我遇到的问题是如何保留顶级仪表板并允许超级管理员查看任何仪表板,并让用户只能查看/访问他们关联的仪表板。

1 个答案:

答案 0 :(得分:0)

在函数开头添加一项检查,检查是否为GET设置了dashboard_id参数。

如果是,请检查用户是否为super_admin并且所请求的仪表板是否存在。

如果这也是真的,那么将$user_dash_id设置为所请求的id的值,而不是从DB中获取

您显然需要添加链接,以便管理员可以从列表或其他内容中选择并选择其首选的信息中心。

示例:

<?php
function clientReportName()
{
    global $conn;
    global $user_id; //you'll need to provide the user_id
    global $user_dash_id;

    if(isset($_GET['dashboard_id']) && is_numeric($_GET['dashboard_id'])){

        $sql = "SELECT * FROM `users` WHERE `user_id` = $user_id AND `user_role` = 0";
        $result = $conn->query($sql);

        if($result->num_rows > 0){
            //they are super_admin

            $dash_id = mysqli_real_escape_string($conn, $_GET['dashboard_id']); //this is probably inadequate to protect you from SQL injection

            $sql = "SELECT * FROM `dashboards` WHERE `dashboard_id` = $dash_id";
            $result = $conn->query($sql);

            if($result->num_rows > 0){
                //The requested dashboard exists, so set it as the new id to be requested
                $user_dash_id = $dash_id;
            }
        }
    }

    $sql = "SELECT * FROM dashboards WHERE dashboard_id = $user_dash_id";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            echo $row["dashboard_name"];
        }
    }
}

这可能需要一些重构,但我认为它显示了这个想法。