【问题标题】:Explanation of PHP sessions with roles please请解释带有角色的 PHP 会话
【发布时间】:2015-06-09 16:58:43
【问题描述】:

我有一个 MySQL 数据库。在那个数据库中,我有一个名为users 的表。在用户中,我有usernamepasswordrole。如果角色是0,那么它就是一个用户。如果角色是1,那么它就是admin

这就是现在的会话设置方式。

if($count==1){
        echo "true";
        $_SESSION['username'] = $user;
        $_SESSION['password'] = $pass;  
    }
    else {
        echo "Wrong";
    }

这是我在页面顶部的内容:

 session_start();

  if(!isset($_SESSION['username'])){
    header("location:login.php");
  }

我对如何再次检查角色感到困惑。例如,如果它是角色 1 = 如果角色 0 - 用户,他们将获得管理页面。

目前,我只有 1 名管理员,这就是我获得授权的方式。

但我不确定这是否正确。我需要解释。

if ( 'admin' == $_SESSION['username'] ) {

    include('admin.php');
}
else {
    include('user.php');
}

【问题讨论】:

    标签: php mysql session login roles


    【解决方案1】:

    你在 login.php 中有数据库连接,对吧?如果用户名和密码当然存在于数据库中,为什么不使用连接并获取用户的角色信息,然后根据该角色值重定向用户(我与一个过程建立连接并调用该过程和加载信息),如果你必须控制用户是否存在; rowcount>1 例如:

    $role = "";
    $username = "";
    $password = "";
    $conn = oci_connect(---);
    $stid = oci_parse($conn, "begin packageX.login(:username,:password,:role); end;");
    
    oci_bind_by_name($stid, ":username", $username);
    oci_bind_by_name($stid, ":password", $password);
    oci_bind_by_name($stid, ":role", $role);
    if ( $role == 1 and $username!="" and $password!="") {
    
        header( "Location: admin.php" );
    }
    else if($role == 0 and $username!="" and $password!=""){ 
        header( "Location: user.php" );
    }
    

    【讨论】:

    • 是的,我有数据库连接。我对在哪里放什么感到困惑。我有三个页面,每个页面都有两个额外的 php 页面(每个用户一个),所以如果是用户,它将包含此页面,如果是管理员,它将包含此页面....
    • 好的,通过您的连接将用户的用户名、密码和角色信息存储在变量中。然后例如如果用户存在于表中,然后查看他的角色编号,然后如果角色是一个,则可以使用 header("Location: admin.php" );否则你重定向用户标头(“位置:user.php”);
    【解决方案2】:

    这两个函数将检查会话是否存在并检查用户权限。

    function confirmed_login(){
    
        if(!isset($_SESSION['permission'])){    
            header('Location: login_redirect.php'); 
        }
    }
    
    function permission_admin($permission){
    
        if($permission != '1'){
            header('Location: login_redirect.php'); 
        }
    }
    
    
    function check_login($p) {
    
        permission_admin($p);
        confirmed_login();
    
    }
    

    只需在任何受限页面的顶部调用此函数,如下所示:

    check_login($SESSION['role']);
    

    【讨论】:

      【解决方案3】:

      您应该在会话中设置角色并且检查的不是用户名而是角色:

      ...
      echo "true";
      $_SESSION['username'] = $user;
      $_SESSION['password'] = $pass; 
      $_SESSION['role'] = $role; 
      ...
      
      if ($_SESSION['role'] == 1) {    
          include('admin.php');
      } else {
          include('user.php');
      }
      

      或者作为替代设置一个管理变量并在用户登录时始终检查它是否存在:

      ...
      echo "true";
      $_SESSION['username'] = $user;
      $_SESSION['password'] = $pass; 
      if($role == 1) {
         $_SESSION['admin'] = true; 
      }
      ...
      
      if (isset($_SESSION['admin'])) {    
          include('admin.php');
      } else {
          include('user.php');
      }
      

      【讨论】:

      • 您只在 login.php 中(或在登录期间)设置了 $_SESSION 值,实际上您根本不应该设置 $_SESSION['password'],这是一个安全漏洞。
      • 然后你把 session_start();在每个 php 文件的顶部(仍然登录或不登录),这样您就可以随时检查 $_SESSION['admin'] 是否已设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2016-04-30
      相关资源
      最近更新 更多