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

Date May 24th, 2010 Author Vitaly Agapov

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

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


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

01.#!/usr/bin/perl
02.use CGI qw(:standard);
03.# Подключаем модуль с опцией привязки сессии к IP-адресу
04.use CGI::Session ( "-ip_match" );
05.use CGI::Session::Driver::mysql;
06.use DBI;
07.# Создаём дескриптор подключения к MySQL
08.my $dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost","username","pwd",{"RaiseError" => 1});
09.my $cgi = new CGI;
10.# Если через форму передано значение login (то есть пользователь пытается авторизоваться)
11.if ($cgi->param("login"))
12.{
13.   # Проверяем логин и пароль. Здесь check_user - это условная процедура, возвращающая
14.   # идентификатор пользователя при успешной аутентификации
15.   my $check_result=&check_user;
16.   if ($check_result =~ /^\d+$/) { # Условие успешной аутентификации
17.        # Инициализация объекта
18.        $session = CGI::Session->new("driver:mysql", undef, { Handle => $dbh } );
19.        # Сохраняем данные сессии. В нашем случае - логин и ID пользователя
20.        $session->param(username => $cgi->param("login"), userid => $check_result);
21.        # Добавляем заголовок с cookies
22.        print $session->header(-location=>"/");
23.        # Устанавливаем "протухание" неактивной сессии через два часа
24.        $session->expire("+2h");
25.        # Сбрасываем данные на драйвер. В нашем случае - в MySQL.
26.        $session->flush();
27.   }
28.   else {
29.        # Доступ запрещён
30.        print $cgi->header(-type=>"text/html",-location=>"login.pl");
31.   }
32.}
33.else {
34.   # Загружаем параметры сессии из базы данных
35.   $session = CGI::Session->load("driver:mysql", undef, { Handle => $dbh } ) or die CGI::Session->errstr;
36.   if ($session) { # Если сессия существуем
37.        $input{"session_login"} = $session->param("username");
38.        $input{"session_userid"} = $session->param("userid");
39.   }
40.   else {
41.        $input{"session_login"} = "Anonymous";
42.        $input{"session_userid"} = 0;
43.   }
44.}
45.# Если через форму передано значение logout (то есть пользователь пытается выйти)
46.if ($cgi->param("logout")) {
47.   # Удаляем сессию
48.   $session->delete();
49.   print $session->header(-location=>"info");
50.   # Удаляем сессию из базы данных
51.   $session->flush();
52.}
53.print header,
54.   start_html,
55.   h1("Hello, $user_name!"),
56.   print <<HTML
57.   <form method="post">
58.   Username: <input type="text" name="usr">
59.   Password: <input type="password" name="pwd">
60.   <input type="submit">
61.   </form>
62.   HTML
63.   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 

Rich Text Editor, comment