Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом

Часть 3. Реализация входа и выхода из системы

Comments

Серия контента:

Этот контент является частью # из серии # статей: Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом

Следите за выходом новых статей этой серии.

1. Введение

В предыдущих статьях многократно описывались вопросы настройки и запуска в эксплуатацию самых разнообразных почтовых служб, - таких как sendmail, postfix, exim, Communigate, qmail, использующих в качестве платформы самый широкий спектр современных Linux- и BSD-систем. В настоящее время, по мере развития Всемирной Паутины все чаще возникает вопрос об актуальности использования услуг электронной почты, основанной на веб. В предыдущих частях цикла статей были рассмотрены вопросы относительно общего плана построения почтовой системы с веб-интерфейсом, создания базы данных под учебный проект и обзора общей библиотеки функций для решения задач обработки почты. Кроме того, мы разобрали главный управляющий сценарий системы. Третья статья цикла посвящена вопросам реализации механизмов аутентификации и авторизации пользователей.

Начало работы при входе в систему

При загрузке пользователем начальной страницы (index.php) у него в браузере должна отображаться страница, показанная на рис.1. Это главная или стартовая страница сайта. Если пользователем не выбрано ни одно действие (при этом, значение переменной action не установлено) и не предоставлены данные для осуществления входа в систему, необходимо выполнить части кода, приводимые ниже. Этот этап, как этап предварительных операций подразумевает выполнение следующих действий:

	include (‘include_fns.php’);
	session_start();
Рисунок 1.
Рисунок 1.
Рисунок 1.

Данные строки запускают механизм сеанса, который будет использован для отслеживания переменных сеанса $auth_user и $selected_account. Эти переменные будут участвовать в процессе работы сценария чуть позже.

Затем создаются короткие имена переменных, как и в каждом сценарии обработки формы. В зависимости от того, где это происходит, такая переменная может быть либо типа GET, либо POST переменной. После этого значение переменной извлекается из массива $_REQUEST . Такие же действия надо производить и с переменной account, поскольку доступ к ней осуществляется обычно с помощью метода GET. При удалении учетной записи доступ к переменной осуществляется через метод POST.

Отображаемые кнопки в панели инструментов пользователя, в целях упрощения манипуляциями с ними, управляются из массива. Сначала создается пустой массив:

$buttons = array();

затем устанавливаются кнопки, отображаемые на странице:

// Создать кнопки, которые будут выводиться в панели инструментов
  $buttons[0] = 'view-mailbox';
  $buttons[1] = 'new-message';
  $buttons[2] = 'account-setup';
  // Кнопка выхода из системы нужна, только если был совершен вход

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

На втором этапе создается несложный заголовок:

 // Вывести заголовок с названием приложения и описанием страницы или действия
    do_html_header($_SESSION['auth_user'],
              "Безопасная и быстрая почта - ".format_action($action),
                   $_SESSION['selected_account']);
  }
  else
  {
    // Вывести заголовок с одним лишь названием приложения
    do_html_header($_SESSION['auth_user'], "Безопасная и быстрая почта",
                   $_SESSION['selected_account']);
  }

  display_toolbar($buttons);

Этим кодом выводится строка заголовка и панель инструментов с кнопками, как показано на рис.1.

Функции, работающие в этом фрагменте кода, находятся в библиотеке output_fns.php. Функция do_html_header() имеет вид:

function do_html_header($auth_user, $title = '', $selected_account)
{
  // Выводит HTML-заголовок, включая крутой [] логотип :)

  global $table_width;

  // Выводит зону заголовка 
?>
  <html>
  <head>
    <title><?php echo $title; ?></title>
    <style>
      h1 { font-family: 'Comic Sans MS',  sans-serif; font-size: 32; 
           font-weight: bold; color:  black; margin-bottom: 0}
      b { font-family: 'Arial', sans-serif; font-size: 13; 
          font-weight: bold; color: black }
      th { font-family: 'Comic Sans MS',  sans-serif; font-size: 18
           font-weight: bold; color:  black; }
      body, li, td { font-family: Arial, Helvetica, sans-serif; 
                     font-size: 12; margin = 5px }
      a { color: #000000 }
    </style>
  </head>
  <body>
  <table width = <?php echo $table_width; ?> cellspacing = 0 
  cellpadding = 3 bgcolor = "#ff6600" border = 0>
  <tr bgcolor = "#ff6600">
  <td bgcolor = "#ff6600" width = 103><img src = "images/warm-mail.gif" 
                 width = 103 height = 45 alt ="" valign = "middle" /></td>
  <td bgcolor = "#ff6600" width = <?php echo ($table_width-110);?>><h1>
  <?php echo $title;?></h1></td>
  <?php
  // Включать кнопку выбора учетной записи, только если пользователь имеет их несколько
  if(number_of_accounts($auth_user)>1)
  {
    echo '<form target="index.php?action=open-mailbox" method="post">';
    echo '<td bgcolor = "#ff6600" align = "right" valign = "middle">';
    display_account_select($auth_user, $selected_account);
    echo '</td>';
    echo '</form>';
  }
  ?>
  </tr>
  </table>
  <table width = <?php echo $table_width;?> cellpadding = 0 cellspacing = 0 border = 0>
  <tr><td>
<?php
}

и функция display_toolbar():

function display_toolbar($button, $extra_parameters = '')
{
  // Выводит панель инструментов
  
  global $table_width;
  
  echo "<table width = $table_width cellpadding = 0 cellspacing = 0  border = 0>";
  echo '<tr>';
  echo '<td bgcolor = "#cccccc" align = "center">';
  for($i = 0; $i < 5; $i++)
  {
    if ($button[$i])
      display_button($button[$i], $extra_parameters);
    else 
      display_spacer();
  }
  echo '</td>';
  echo '</tr>';
  echo '</table>';
}

Далее по коду поток исполнения переходит к следующему фрагменту:

if(!check_auth_user())
  {
    echo '<p>Вы должны сначала войти в систему';
    if($action&&$action!='log-out')
      echo ' и затем переходить на '.format_action($action);
    echo '.</p><br /><br />';
    display_login_form($action);
  }

сама функция check_auth_user()входит в библиотеку, которая имеет вид:

<?php
function login($username, $password)
// Проверяет наличие имени пользователя и пароля в базе данных.
// Ести это так, возвращает значение true,
// в противном случае -- false.
{
  // Подключиться к базе данных
  $conn = db_connect();
  if (!$conn)
    return false;

  $result = $conn->query("select * from users 
                         where username='$username'
                         and password = sha1('$password')");
  if (!$result)
     return false;
  if ($result->num_rows>0)
     return true;
  else 
     return false;
}

function check_auth_user()
// Проверяет, вошел ли посетитель в систему, и уведомляет его, если нет
{
  if (isset($_SESSION['auth_user']))
    return true;
  else
    return false;
}

?>

она используется для проверки того, вошел пользователь в систему или нет. Если не вошел, то отображается форма для входной регистрации (см. рис.1). Эта форма генерируется функцией display_login_form(), которая имеет вид:

function display_login_form($action)
{
  // Выводит форму, запрашивающую имя пользователя и пароль
?>
  <center>
  <form method="post" action="index.php?action=<?php echo $action; ?>">
  <table bgcolor='#cccccc'  border = 0 cellpadding = 6 cellspacing = 0>
   <tr>
     <th colspan = 2 bgcolor = '#ff6600'>
       Вход в систему
     </th>
   </tr>
   <tr>
     <td>Имя пользователя:</td>
     <td><input type="text" name="username"></td></tr>
   <tr>
     <td>Пароль:</td>
     <td><input type="password" name="passwd"></td></tr>
   <tr>
     <td colspan=2 align="center">
     <?php display_form_button('log-in'); ?>
     </td></tr>
   <tr>
 </table></form>
 </center>
<?php
}

При правильном заполнении формы и щелчке на кнопке “Log in” отображается страница, представленная на рис.2. В этом случае будут активизированы различные участки главного сценария. Если заполнены поля в форме входной регистрации $username и $password, то активируется следующий участок кода:

// Необходимо сначала обработать запросы на вход и выход из системы
  if($username || $password)
  {
    if(login($username, $passwd))
    {
      $status .= '<p>Вы успешно вошли в систему.</p><br /><br /><br /><br />
                  <br /><br />';
      $_SESSION['auth_user'] = $username;
      if(number_of_accounts($_SESSION['auth_user']) == 1)
      {
        $accounts = get_account_list($_SESSION['auth_user']);
        $_SESSION['selected_account'] = $accounts[0];
      }
    }
    else
    {
      $status .= '<p>Извините, вход в систему с данным именем пользователя
            и паролем невозможен.</p><br /><br /><br /><br /><br /><br />';
    }
  }

здесь используется функция login(), рассмотренная выше по тексту (см. function login($username, $password)).

Рисунок 2.
Рисунок 2.
Рисунок 2.

Если все проходит удачно, то имя пользователя регистрируется в переменной сеанса auth_user.

Помимо отображаемых кнопок, представляются кнопки, дающие возможность пользователю выйти из системы:

  if (check_auth_user())
  {
	$buttons[4] = ‘log-out’;
  }

На следующем этапе, связанном с формированием заголовков, опять отображаются заголовки и кнопки, и выводится сообщение состояния, созданное ранее – echo $status;

Затем выводится нижний колонтитул do_html_footer();

function do_html_footer()
{
  // Выводит завершающие HTML-дексрипторы
  global $table_width;
?>
  </td></tr>
  </table>
  <table width = <?php echo $table_width;?> cellspacing = 0 cellpadding = 6 border = 0>
  <tr>
  <td bgcolor = "#ff6600" align = right><img src = "images/warm-mail.gif"
                 width = 103 height = 45 alt ="" valign = "middle" />
  </td>
  </tr>
  </table>
  </body>
  </html>
<?php
}

и начинается процесс ожидания ввода пользователем следующих действий.

Выводы

В третьей статье цикла, подробно рассмотрены вопросы общей структуры создаваемой почтовой системы с веб-интерфейсом и порядка ее функционирования. Приведены и описаны фрагменты кода главного управляющего сценария системы, отвечающие за организацию входа и выхода пользователей. Рассмотрены функции формирования титульной страницы, вывода верхнего и нижнего колонтитула. Описана структура сценария, и его составные части в контексте реализации входа – выхода пользователей. Приведены и описаны задействованные в работе функции. Обзорно рассмотрен логический порядок работы частей сценария, показано для чего и как они функционируют, что является источником инициализации тех или иных событий в работе. Приведены снимки экрана, поясняющие работу сценариев и отдельных участков кода.

В следующей статье будет подробно изучена реализация механизма создания пользователей системы и манипулирования их учетными записями.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=578379
ArticleTitle=Реальные веб-проекты на PHP и MySQL. Разработка почтовой службы с веб-интерфейсом: Часть 3. Реализация входа и выхода из системы
publish-date=11112010