0

我正在使用登录脚本,并且我正试图在没有太多运气的情况下进行会话。

当用户登录时,我希望他们重定向到相关文件夹,这是我的登录脚本

  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');
            }

当用户登录角色时我想要发生的事情确定要打开哪个文件夹,如果没有人登录,他们将无法打开该文件夹

希望这是有道理的

谢谢莫莉

4

1 回答 1

0

这一切都取决于你试图实现什么。我现在很容易使用一些框架或微框架来覆盖引擎盖下的一些基本内容,这样你就不会再重新创建自行车了。这就是你获得优势的地方。在你的情况下,如果这是一个模板项目,我会这样做:

项目的根目录/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');
}

但它应该更安全。因为现在这段代码对攻击者开放。保护您的代码的好方法,您也可以在网络上的大量材料中找到,也可以在此处找到:PHP Sessions in Depth

我建议你尝试Slim PHP 微框架LaravelYii来享受工作,并在 PHP 上创建新项目。

于 2020-08-28T02:42:21.563 回答