Пример: запомнить меня онлайн урок.


В этой лекции мы рассмотрим простой пример формы аутентификации с возможностью запомнить пользователя, чтобы он не вносил свой пароль и логин в форму каждый раз. Для начала создадим форму:
<form action="admin.php" method="post">
<input type="text" name="username"/> <br/> <br/>
<input type="password" name="password"/> <br/> <br/>
<input type="checkbox" name="remember"/> Remember me <br/> <br/>
<input type="submit"/>
</form>

Следует обратить внимание на флажок Remember Me. Если флажок отмечен, то при обработке формы (в случае успешной аутентификации) будут отправлены куки с данными пользователя.

Создадим теперь файл admin.php, в котором обработаем данные формы. Для простоты примера в этом же файле будет сохранены данные о пользователе, которые обычно хранятся в базе данных.

$db_data = array(
  'username' => 'jessie',
  'password' => 'magnets'
);


Далее следует определить - была ли отправлена форма. Если да, то извлечь данные. Если нет, то проверить, пришли ли куки с информацией о пользователе. Если и кук нету, то сообщим, что страница закрыта от публичного доступа.

if ($_POST) {
   $username = isset($_POST['username']) ? $_POST['username'] : null;
   $password = isset($_POST['password']) ? $_POST['password'] : null;
} elseif ($_COOKIE) {
   $username = isset($_COOKIE['username']) ? $_COOKIE['username'] : null;
   $password = isset($_COOKIE['password']) ? $_COOKIE['password'] : null;
} else {
   die("Restricted area!");
}


После этой конструкции (если скрипт не умер) мы можем проверить совпадает ли логин/пароль:

foreach ($db_data as $k => $v) {
   $status = $status && ($$k === $v);
}


Тут $status - это переменная, которой следует присвоить изначальное значение true. После этого цикла она будет содержать true только если совпали username и password пользователя. В этом случае необходимо проверить флажок Remember Me и отправить куки, если он отмечен:

if ($status) {
   if (isset($_POST['remember'])) {
     setcookie('username', $username, time() + 60*60*24*366);
     setcookie('password', $password, time() + 60*60*24*366);
   }
   echo 'Logged in!';
}


Получим такой результат: если успешно зашли, но не отметили флажок, то следующий заход на admin.php уже не будет возможен, т.к. мы не сохранили состояние результата аутентификации. Если успешно зашли и отметили флажок, то мы можем даже после перезагрузки браузера зайти на admin.php и увидеть, что мы зашли в систему, т.к. были подставлены сохраненные куки.