【问题标题】:Attempting to verify user roles in dashboard尝试在仪表板中验证用户角色
【发布时间】:2019-06-27 07:48:46
【问题描述】:

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

登录效果很好,但检查用户角色的效果并不好。

该站点为每个角色都有一个仪表板,每个角色的顶部是这样的:

session_start(); 
if(!$_SESSION['sess_role'] == 'role1') {
    header('location:../../index.php');
}

当您尚未登录时,它似乎可以正常工作,因为“sess_role”属性不匹配,所以将您正确返回到索引页面,但是一旦我使用任何用户登录,我就可以进入每一个仪表板通过手动输入 URL,尽管它没有正确的“角色”。

这是登录代码:

$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”,但我仍然可以进入。

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

【问题讨论】:

  • 您应该在每个标题后添加exit;。您的代码可能希望继续执行。另一件事;为什么要存储纯文本密码?
  • 好吧,好像就是这样!添加退出后;在需要的地方一切正常,感谢您的帮助!

标签: php mysql session authentication pdo


【解决方案1】:

! 运算符绑定到 $_SESSION['sess_role'],而不是整个表达式。您必须将表达式放在括号中if(!($_SESSION['sess_role'] == 'role2')) 或更好地使用不等于运算符以获得更好的可读性if($_SESSION['sess_role'] != 'role2') {

【讨论】:

  • 尝试了你的两个建议,但似乎问题仍然存在
【解决方案2】:

事实证明,根据a comment I left,是失败的原因:

你应该添加出口;在每个标题之后。您的代码可能想要继续执行。

建议使用带有 exit 的标头,按照 Stack Overflow 上的以下问答:

添加注释;不要存储纯文本密码。使用 password_hash() 存储它的哈希版本:

然后用password_verify()验证它们:

请通读一遍,这很重要。

仅使用准备好的语句是不够安全的,对于密码而言更是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 2021-03-11
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2019-10-05
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多