Php 正在尝试验证仪表板中的用户角色

Php 正在尝试验证仪表板中的用户角色,php,mysql,session,authentication,pdo,Php,Mysql,Session,Authentication,Pdo,我正在尝试创建一个登录系统来检查用户角色并重定向到相应的仪表板,同时还禁止用户手动输入其他人的仪表板URL 登录工作很好,但是检查用户角色,就没那么多了 该站点针对每个角色都有一个仪表板,每个仪表板之上都有以下内容: session_start(); if(!$_SESSION['sess_role'] == 'role1') { header('location:../../index.php'); } 当您尚未登录时,它似乎可以正常工作,因为“sess_role”属性不匹配,所以

我正在尝试创建一个登录系统来检查用户角色并重定向到相应的仪表板,同时还禁止用户手动输入其他人的仪表板URL

登录工作很好,但是检查用户角色,就没那么多了

该站点针对每个角色都有一个仪表板,每个仪表板之上都有以下内容:

session_start(); 
if(!$_SESSION['sess_role'] == 'role1') {
    header('location:../../index.php');
}
当您尚未登录时,它似乎可以正常工作,因为“sess_role”属性不匹配,所以会正确地将您发送回索引页。但是,一旦我与任何用户登录,我就可以通过手动输入URL进入每个仪表板,尽管没有正确的“role”

以下是登录代码:

$msg = ""; 
if(isset($_POST['submitBtnLogin'])) {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
    if($username != "" && $password != "") {
        try {
            $query = "select * from `users` where `username`=:username and `password`=:password";
            $stmt = $db->prepare($query);
            $stmt->bindParam('username', $username, PDO::PARAM_STR);
            $stmt->bindValue('password', $password, PDO::PARAM_STR);
            $stmt->execute();
            $count = $stmt->rowCount();
            $row   = $stmt->fetch(PDO::FETCH_ASSOC);
            if($count == 1 && !empty($row)) {

                $_SESSION['sess_user_id']   = $row['id'];
                $_SESSION['sess_username'] = $row['username'];
                $_SESSION['sess_role'] = $row['role'];
            }

                if($row['role'] == "role1") {
                header('location:modules/role1/index.php');
                } else if($row['role'] == "role2") {
                header('location:modules/role2/index.php');
                } else if($row['role'] == "role3") {
                header('location:modules/role3/index.php');
                } else if($row['role'] == "role4") {
                header('location:modules/role4/index.php');

            } else {
                $msg = "Invalid login information.";
            }
        } catch (PDOException $e) {
            echo "Error : ".$e->getMessage();
        }
    } else {
        $msg = "Both fields are required.";
    }
}
我试着做:

echo($_SESSION['sess_role']);
查看输出是什么,并且它似乎按照预期工作,当我在“role1”帐户上时显示“role1”,对于其他角色也是如此

例如,当访问“role2”仪表板时,输出仍然是“role1”,但我仍然可以输入


我非常感谢您在确定问题方面提供的帮助。

代码>运算符绑定到
$\u会话['sess\u角色]
,而不是整个表达式。如果(!($\u SESSION['sess\u role']='role2'))或者更好地使用not equals运算符以提高可读性
如果($\u SESSION['sess\u role']!='role2'){

结果和根据,是导致失败的原因:

您应该在每个头之后添加exit;。您的代码可能希望继续执行

根据以下关于堆栈溢出的问答,建议使用带有
出口的标题

在附加说明中;不要存储纯文本密码。使用
密码\u hash()
存储哈希版本的密码:

然后使用
password\u verify()
验证它们:

请通读一遍,这很重要


仅使用准备好的语句是不够安全的,在涉及密码时就不安全了。

尝试了您的两个建议,但问题似乎仍然存在。您应该在每个标题后添加
exit;
。您的代码可能希望继续执行。另一件事;您为什么要存储纯文本密码?似乎是这样是的!在添加了exit之后;在需要它的地方一切正常,谢谢您的帮助!