使用新用户登录时,旧会话不会被破坏

时间:2018-06-25 13:42:45

标签: javascript php jquery ajax session

安全性将在以后添加

我有一个登录脚本,该脚本要么返回json消息(错误的组合,空字段等),要么启动会话并根据登录的用户重定向用户。

现在有两种可能性:adminuser

当我第一次以admin身份登录时,一切正常,但是随后以用户身份登录,然后看到admin的名称和admin会话中的徽标。但是,我已重定向到正确的页面。

无论我刷新多少(甚至是硬刷新ctrl + shift + r),都只有在Chrome中启动隐身窗口并首先以用户身份登录时,才能获得正确的用户信息。

有时,当我登录时,我也会立即重定向到我的登录表单。所以我的代码肯定有问题,但是我不确定是什么。

我的由ajax代码调用并启动会话的PHP脚本返回为JSON,在这种情况下是否有可能启动会话?

现在我的Ajax代码:

// Login Ajax Code
$( "#content" ).on("submit", "#loginform", function( event ) {
  // Stop normal form behaviour
  event.preventDefault();
  // Retrieve input fields and their values
  var $form = $( this ),
  $username = $form.find( "input[name='username']" ).val(),
  $userpassword = $form.find( "input[name='userpassword']" ).val(),
  url = $form.attr( "action" );
  // Post above values to the action of the form
  var posting = $.post( url, { username: $username, userpassword: $userpassword} );
  // Show result in a div
  posting.done(function( data ) {
    obj = JSON.parse(data);
    if(obj.userdata == ''){
      $( "#loginresult" ).empty().slideDown('fast').append( obj.message );
    }else if(obj.userdata == 'admin'){
      window.location.href = "http://www.vcaweb.nl/admin";
    }else if(obj.userdata == 'user'){
      window.location.href = "http://www.vcaweb.nl/dashboard";
    }
  }, "json");
});

我的php脚本:

<?php
session_start();

*connection class is here*
$conn = new Connection;

$username = $_POST['username'];
$userpassword = $_POST['userpassword'];

*error messages code not relevant*
else{
  //Both filled in, begin logincode:
  $getuser = "
    SELECT u.id as userid, u.username, u.rights, u.password, c.name, c.userid as companyuid, c.logo
    FROM users u
    LEFT JOIN company c
    ON u.id = c.userid
    WHERE u.username = '".$conn->real_escape_string($username)."'";
  $getusercon = $conn->query($getuser);
  $getuser = $getusercon->fetch_assoc();

    if(!empty($getuser['logo'])){
      $sessionlogo = str_replace('/home/vcaweb/public_html/', '', $getuser['logo']);
    }else{
        $sessionlogo = 'Hier een placeholder';
    }

  if($userpassword == $getuser['password']){
    if($getuser['rights'] == '1'){
      $_SESSION['userdata']['user'] = 'Mark Kraaijo';
            $_SESSION['userdata']['rights'] = '1';
            $_SESSION['userdata']['logo'] = 'assets/images/logo.png';
      $loginresult = array(
        'login_result' => 'success',
     );
      $logindata = array(
        'userdata' => 'admin',
     );
    echo json_encode($logindata);
    }else{
      $_SESSION['userdata']['user'] = $getuser['name'];
            $_SESSION['userdata']['rights'] = '0';
            $_SESSION['userdata']['logo'] = $sessionlogo;
      $loginresult = array(
        'login_result' => 'success',
     );
      $logindata = array(
        'userdata' => 'user',
     );
    echo json_encode($logindata);
    }
  }else{
        $logindata = array(
            'userdata' => '',
            'message' => 'Wachtwoord en gebruikersnaam komen niet overeen',
     );
    echo json_encode($logindata);
  }
}
?>

在重定向页面的页眉中,我有以下内容:

// Check if session is set
if(isset($_SESSION['userdata'])){
  // Check if user is admin, if yes and user has rights to visit page, redirect to loginpage
  if($_SESSION['userdata']['rights'] == '0' && $restriction == 'admin'){
    header('Location: http://www.vcaweb.nl/login');
  }
  // Logo
  $logo = '<img class="headerlogo" src="'.$_SESSION['userdata']['logo'].'">';
}else{
  header('Location: http://www.vcaweb.nl/login');
}

在我的登录表单的标题中(包括启动会话的连接类文件):

session_unset();
session_destroy();

为什么会话未完全销毁?

1 个答案:

答案 0 :(得分:0)

使用unset($_SESSION['userdata']);删除用户会话,并在session_regenerate_id(true)之后立即使用session_start()

使用session_destroy()函数是正确的,但是session_unset()用于创建会话的不赞成使用的方法。

请点击此链接以获取更多信息http://php.net/manual/ro/function.session-destroy.php