Работа с сессиями в Perl

Date May 24th, 2010 Author Vitaly Agapov

Механизм сессий позволяет производить аутентификацию пользователей и сохранять некоторые данные между сеансами работы каждого пользователя в Web. Этот метод обладает рядом преимуществ перед вариантом с хранением всей пользовательской информации в cookies, потому как при этом все данные хранятся на сервере, а от пользователя необходимо получать только индентификатор сессии.

В Perl работу с сессиями обеспечивает модуль CGI::Session. Он позволяет сохранять данные о сессиях в файлах или в базе данных. Подерживаются в том числе такие вещи, как DB2 или SQLite. Нас же интересует в основном MySQL (CGI::Session::Driver::mysql).


Рассмотрим на примере условного cgi-скрипта, как все это делается.

#!/usr/bin/perl
use CGI qw(:standard);
# Подключаем модуль с опцией привязки сессии к IP-адресу
use CGI::Session ( "-ip_match" );
use CGI::Session::Driver::mysql;
use DBI;
# Создаём дескриптор подключения к MySQL
my $dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost","username","pwd",{"RaiseError" => 1});
my $cgi = new CGI;
# Если через форму передано значение login (то есть пользователь пытается авторизоваться)
if ($cgi->param("login"))
{
   # Проверяем логин и пароль. Здесь check_user - это условная процедура, возвращающая
   # идентификатор пользователя при успешной аутентификации
   my $check_result=&check_user;
   if ($check_result =~ /^\d+$/) { # Условие успешной аутентификации
		# Инициализация объекта
		$session = CGI::Session->new("driver:mysql", undef, { Handle => $dbh } );
		# Сохраняем данные сессии. В нашем случае - логин и ID пользователя
		$session->param(username => $cgi->param("login"), userid => $check_result);
		# Добавляем заголовок с cookies
		print $session->header(-location=>"/");
		# Устанавливаем "протухание" неактивной сессии через два часа
		$session->expire("+2h");
		# Сбрасываем данные на драйвер. В нашем случае - в MySQL.
		$session->flush();
   }
   else {
		# Доступ запрещён
		print $cgi->header(-type=>"text/html",-location=>"login.pl");
   }
}
else {
   # Загружаем параметры сессии из базы данных
   $session = CGI::Session->load("driver:mysql", undef, { Handle => $dbh } ) or die CGI::Session->errstr;
   if ($session) { # Если сессия существуем
		$input{"session_login"} = $session->param("username");
		$input{"session_userid"} = $session->param("userid");
   }
   else {
		$input{"session_login"} = "Anonymous";
		$input{"session_userid"} = 0;
   }
}
# Если через форму передано значение logout (то есть пользователь пытается выйти)
if ($cgi->param("logout")) {
   # Удаляем сессию
   $session->delete();
   print $session->header(-location=>"info");
   # Удаляем сессию из базы данных
   $session->flush();
}
print header,
   start_html,
   h1("Hello, $user_name!"),
   print <<HTML
   <form method="post">
   Username: <input type="text" name="usr">
   Password: <input type="password" name="pwd">
   <input type="submit">
   </form>
   HTML
   end_html;

Для работы модуля в базе данных должна быть таблица sessions:

mysql> desc sessions;

+-----------+----------+------+-----+---------+-------+
| Field     | Type     | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| id        | char(32) | NO   | PRI | NULL    |       |
| a_session | text     | NO   |     | NULL    |       |
+-----------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

 

Tags: ,
Category: MySQL, Perl, Web-dev | 6 Comments »

Comments

6 комментариев на “Работа с сессиями в Perl”

  1. Коля

    Спасибо, информация оказалась полезной. зы Сайт мне очень понравился :)

  2. Анонимиус

    А как сделать тоже самое только данные сеси из базы получать не по айпи, а по айди сесии из кукисов ?

  3. Анонимиус

    А как сделать тоже самое только данные сессии из базы получать не по айпи, а по айди сесии из кукисов ?.

  4. Vitaly Agapov

    Вообще-то именно так здесь всё и происходит. IP-адрес пользователя никоим образом не участвует в поддержании сессии. Участвует только индентификатор сессии, который генерится модулем CGI::Session

  5. Анонимус

    Виталий тогда непонятно где в коде айди сессии в куки передается …

  6. driver booster

    driver booster

    agapoff.name | IT блог » Blog Archive » Работа с сессиями в Perl

Leave a comment

 Comment Form