为了账号安全,请及时绑定邮箱和手机立即绑定

我无法为不同的用户角色启动会话并限制注销用户的文件夹

我无法为不同的用户角色启动会话并限制注销用户的文件夹

PHP
精慕HU 2023-11-03 17:40:11
我正在使用登录脚本,并且正在尝试了解会话,但运气不佳。当用户登录时,我希望他们重定向到相关文件夹,这是我的登录脚本  if (isset($_POST['btnLogOn'])) {          $email     = !empty($_POST['email']) ? trim($_POST['email']) : null;        $password = !empty($_POST['password']) ? $_POST['password'] : null;           $db=DB();        $sql = "SELECT  * FROM users WHERE  email = ? LIMIT 1";        $stat = $db->prepare($sql);        $stat->bindParam(1, $email, PDO::PARAM_STR);        $stat->execute();        $row = $stat->fetch();        if ($row && password_verify($password, $row['password'])) {             if (isset($_POST['remember'])) {                setcookie('email', $email, time() + 60 * 60 * 7);                setcookie('password', $password, time() + 60 * 60 * 7);            }            {          $_SESSION['user_session'] = $row['user_id'];          $_SESSION['user_role'] = $row['role'];          switch($_SESSION['user_role']){             case 'Admin':                 $_SESSION['user_role'];                 header( 'Location: admin');                 break;             case 'Advisor':                 $_SESSION['user_role'] ;                 header( 'Location: advisor');                 break;              case 'Tech':                 $_SESSION['user_role'] ;                 header( 'Location: tech');                 break;                 case 'User':                 $_SESSION['user_role'];                  // redirect to admin                 header( 'Location: dashboard');                 break;                 }我不确定上面的代码是否正确,并且我真的很难在每个“命名”文件夹的标题中编写什么代码。我在单独的标头中尝试了很多乱七八糟的代码,但它要么不断刷新到 ../index.php,要么让我打开文件夹,无论我是否登录            session_start();         $_SESSION['user_session'] = $row['user_id'];          $_SESSION['user_role'] = $row['role'];            if(empty($_SESSION['user_role'])){            header('Location: ../index.php');            }当用户登录角色时我想要发生的事情确定要打开哪个文件夹,如果没有人登录,他们将无法打开该文件夹
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

这完全取决于您想要实现的目标。如今,很容易使用一些框架或微框架来覆盖引擎盖下的一些基本内容,这使您不必再次重新创建自行车。这就是你获得优势的地方。在你的情况下,如果这是一个模板项目,我会这样做:


项目根目录/index.php


...


    if (isset($_POST['btnLogOn'])) {  

    

       ...//get find user if exist

    

       $domain = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]";

       if ($row && password_verify($password, $row['password'])) { 

          if (isset($_POST['remember'])) {

             setcookie('email', $email, time() + 60 * 60 * 7);

             setcookie('password', $password, time() + 60 * 60 * 7);

          }

          $_SESSION['user_session'] = $row['user_id'];

          $_SESSION['user_role'] = $row['role'];

          switch($_SESSION['user_role']){

             case 'Admin':

                $dir = 'admin';

                break;

             case 'Advisor':

                $dir = 'advisor';

                break;

             case 'Tech':

                $dir = 'tech';

                break; 

             case 'User':

                $dir = 'dashboard';

                break;

             default:

                $dir = 'index.php';

           }

           header( 'Location: ' . $domain . DIRECTORY_SEPARATOR . $dir);

        }

    }


...

和这里:


根目录/admin/index.php


$domain = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]";

//check if user exist it is admin

if(!isset($_SESSION['user_session']) || (isset($_SESSION['user_role']) && $_SESSION['user_role'] != 'admin')){

    //it is not, redirect

    header( 'Location: ' . $domain . DIRECTORY_SEPARATOR . 'index.php');

}

但它应该更加安全。因为现在这段代码对攻击者开放。


查看完整回答
反对 回复 2023-11-03
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信