Автоматический logout

Ekaterina

Новичок
Автоматический logout

Есть основной файл index.php - проверяется соответствие введенного логина и пароля с данными из файла, старт сессии, объявление переменных сессии, есть в этом файле такой кусок:
PHP:
if (isset($_POST['user_name']))  
{  	......
   foreach($users_log_psw as $k=>$v) 
   {     	  
   	  if ($user_name_crypt == $k && $user_password_crypt == $v )
         {          
            // если пользователь найден в файле
            // зарегистрировать его имя         
         
            session_start();
         
            $valid_user = $user_name;
                  
            $_SESSION['valid_user'] = $valid_user;
            $_SESSION['session_start'] = time();
                                  
         }    	
   }   
}

if (isset($_SESSION['valid_user']))
{  
    header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/"."admin_only.php");
    exit;
}
else 
{     	
	if (isset($_GET['expired'])) {
		
       $expired_message = "<font color = 'red'>Your session has expired. Please Log In again</font><br />";
       echo $expired_message;
              
}
      
       /*
        форма для аутентификации
       */
?>
И есть файл admin_only.php, в котором по истечении timeout, происходит перенаправление на index.php в следующем виде:
PHP:
if ($_SESSION['session_start'] + $session_timeout < time()) 
   {
      unset($_SESSION['valid_user']);
      unset($_SESSION['session_count']);
      unset($_SESSION['session_start']);
      session_destroy();
      header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/"."index.php?expired=yes");	 
      exit;
   }
Я не понимаю, почему когда я просто обновляю страницу с адресом : http://localhost/tabs/index.php?expired=yes, я попадаю на опять http://localhost/tabs/admin_only.php, хотя ж ведь вроде бы уже загружена index.php и страница просто должна обновится с тем же параметром expired.
 

Вурдалак

Продвинутый новичок
Re: Автоматический logout

Автор оригинала: Ekaterina
Я не понимаю, почему когда я просто обновляю страницу с адресом : http://localhost/tabs/index.php?expired=yes, я попадаю на опять http://localhost/tabs/admin_only.php, хотя ж ведь вроде бы уже загружена index.php и страница просто должна обновится с тем же параметром expired.
Значит у Вас существует $_SESSION['valid_user']. До проверки существования $_GET['expired'], судя по коду, в таком случае не дойдёт: будет перенаправление на "admin_only.php"
 

Ekaterina

Новичок
Re: Re: Автоматический logout

Автор оригинала: Вурдалак
Значит у Вас существует $_SESSION['valid_user']. До проверки существования $_GET['expired'], судя по коду, в таком случае не дойдёт: будет перенаправление на "admin_only.php"
По истечении timeout страница с адресом: http://localhost/tabs/index.php?expired=yes, отображается только , если $_SESSION['valid_user'] - не существует.
Но при перезагрузке это же страницы, срабатывает условие if (isset($_POST['user_name'])). Получается, что php сохраняет значение $_POST['user_name'], которое было введено до logout. Как от этого избавится?
 

Фанат

oncle terrible
Команда форума
девушка, побойтесь бога
рнр ничего не сохраняет
 

Вурдалак

Продвинутый новичок
Re: Re: Re: Автоматический logout

Автор оригинала: Ekaterina
По истечении timeout страница с адресом: http://localhost/tabs/index.php?expired=yes, отображается только , если $_SESSION['valid_user'] - не существует.
На этой странице от timeout ничего не зависит, в любом случае "Your session has expired" отобразится только если $_SESSION['valid_user'] не существует.

$_POST['user_name'] нигде, конечно, не сохраняется, перепроверьте действительно ли время сессии истекло.
 

Ekaterina

Новичок
Re: Re: Re: Re: Автоматический logout

Помогите плиз, я не могу понять почему так получается:
Это index.php
PHP:
<?

if (isset($_POST['user_name']))  
{  	
    $user_name = $_POST['user_name'];
    $user_password = $_POST['user_psw'];

    $user_name_crypt = md5($user_name);
    $user_password_crypt = md5($user_password);
	    
// если пользователь пытается залогиниться
   $info_about_users =   file( '../password/ulp.txt' );
   
   $users_log_psw = array();   
      
   foreach($info_about_users as $v)
   {
      $user = explode(":",$v);
      $users_log_psw[$user['0']] = chop($user['1']); //обрезали символы новой строки в конце строки         
     
   }
      
   foreach($users_log_psw as $k=>$v) 
   {     	  
   	  if ($user_name_crypt == $k && $user_password_crypt == $v )
      {          
         // если пользователь найден в файле
         // зарегистрировать его имя         
         
         session_start();
         
         $valid_user = $user_name;
                  
         $_SESSION['valid_user'] = $valid_user;
         $_SESSION['session_start'] = time();                         
      }    	
   }   
}
?>

<html>
<head>
    <meta http-equiv="Content-Language" content="ru">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>Entrance for authorized users</h1>
<?
if (isset($_SESSION['valid_user']))
{   
	header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/"."admin_only.php");
	exit;
}
else 
{   //если пользователь пытался залогиниться. но возникла ошибка
	if (isset($user_name) )
	{
		echo "<font color = 'red'>You can't log in. Check your login and password</font>";
		
		//форма для аутентификации-->
		exit;
	}
		
	if (isset($_GET['expired'])) {
		
       $expired_message = "<font color = 'red'>Your session has expired. Please Log In again</font><br />";
       echo $expired_message;
              
    }
      
//форма для аутентификации

}
?>

</body>
</html>
Это admin_only.php
PHP:
<html>
<head>
    <meta http-equiv="Content-Language" content="ru">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
</html>


<?
session_start();


if (!isset($_SESSION['session_start']))
   {
   	$session_start = time();
   	$_SESSION['session_start'] = $session_start;
   	
   } 
   
   
   $session_timeout = 900; // 15 минут в сек.
   $t =  $_SESSION['session_start'] + $session_timeout;  
   
   if ($t < time()) 
   {
      unset($_SESSION['valid_user']);
      unset($_SESSION['session_start']);
      session_destroy();
      header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/"."index.php?expired=yes");	 
      exit;
   }
   else 
   {
     $session_start = time();
     $_SESSION['session_start'] = $session_start;
     
   }

echo "<h3>Page for administrators</h3>";

if (isset($_SESSION['valid_user']))
{
   echo "You are logged in as: ".$_SESSION['valid_user']."<br><br>";
   echo "<a href=\"logout.php\">Log out</a><br>";
      
}
else 
{
   echo "<p>You are not logged in .</p>";
   echo "<p>Only logged in memmbers may see this page!</p>";
   echo "<a href='index.php'>Back to Log in page</a><br>";
}
?>
Первый раз по истечении timeout происходит перенаправление на http://localhost/tabs/index.php?expired=yes, то есть значит $_SESSION['valid_user'] - не существует. Но при обновлении этой ссылки почему-то отрабатывает часть кола из index.php, которая должна работать, если $_SESSION['valid_user'] - существует. При этом происходит перенаправление на admin_only.php, но там уже $_SESSION['valid_user'] - не существует.

Все работает, как надо если в admin_only.php закомментировать:
PHP:
if (!isset($_SESSION['session_start']))
   {
   	$session_start = time();
   	$_SESSION['session_start'] = $session_start;
   	
   }
Но я не понимаю почему так получается, перменная $_SESSION['session_start'] не уничтожается и как это связано с $_SESSION['valid_user'] . Время сессиии истекает, потому что отрабатывает код после этого.
 

nirex

Новичок
структурируйте ваш код хотя бы по функциям:
(hash) getUsers($userStorage) // $userStorage путь к файлу
(bool) checkUser( (hash) $storage, (string) $userName, (string) $userPasswd) проверка юзера в вашем хранилище
(bool) initSession()
setToSession((hash) $params)
getFromSession($key)
(bool) validUser($timeout)
redirect($url)

все эти ф-ии положите в отельный файл , который надо прикреплять каждый раз когда необходимо, не вносите в них функционал вывода на экран (никаких echo print etc)

избавьтесь от хардкода "$session_timeout = 900;" поместив такого рода значения в хэш $config = array(key=>value), для которого тоже сделайте отдельный файл config.php

файлы index.php, .... должны выглядеть так

<?php
Подключение необходимых либ, конфигов и прочее
а уже вот здесь можете делать как вы умеете
?>

сделав так вы сможете исправить свою ситуацию, плюс дадите своему детище возможность на расширение :)
 

Фанат

oncle terrible
Команда форума
в код не вчитывался, но порекомендую давать индексам массива SESSION и глобальным переменным РАЗНЫЕ имена
и отключить регистер жлобалс
 
Сверху