Автор Тема: Конкретная задача. Сессии на Perl.  (Прочитано 14376 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #15 : 12 Июля 2005, 13:50:53 »
Посмотрел документацию Apache::Session::Store::MySQL
в общем-то хранение ничем не отличается, тот же sid + хеш с данными в a_session
Для построения какого-нибудь частопосещаемого ресурса (например форума) ИМХО не лучший вариант, потому как сериализация данных - ненужное и лишнее телодвижение, когда обычно от сессии требуется воз-ть идентифицировать пользователя ну и узнать служебные параметры сессии (ip ,время), что лучше бы просто вынести в отдельные поля
 в исканиях.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #16 : 12 Июля 2005, 15:05:09 »
Green Kakadu спасибо.
пока-пока. :)

Оффлайн DSA

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #17 : 14 Июля 2005, 09:01:14 »
Простите пожалуйста что вмешиваюсь в вашу беседу,но меня тоже очень интересует принцип использования сессий (в моем случае для авторизации/аутентификации на сайте) с помощью модуля CGI::Session. А проблема моя заклчается в том, что я, даже после прочтения здаровенного мануала(туториала), так и не понял, каким образом можно/нужно проверять является ли пользователь "хозяином" сессии? (т.е. тем,кто ее изначально создал в том виде и с тем ключом, с которым она есть).

А я проделываю следующее:

my $cgi = new CGI;
my $cookie;
my $sid = $cgi->cookie("CGISESSID") || undef;
my $session = new CGI::Session(undef, $sid, {Directory=>\'Z:/tmp\'});

unless ($sid) {
 $cookie = $cgi->cookie(CGISESSID => $session->id);
 print $cgi->header(-cookie=>$cookie);
}

Это в основном вырезки из туториала. Но вот мне не совсем понятно каким образом происходит АУТЕНТИФИКАЦИЯ. Тоесть определения честности пользователя. И что происходит, когда в качестве второго параметра в конструктор CGI::Session передается значение, не равное undef? Тоесть если undef, насколько я понял, создается новая сессия, а если нет? Есть ли тогда вообще смысл в этой часте кода при $sid не undef? (... new CGI::Session(undef, $sid, {Directory=>\'Z:/tmp\'});

Заранее спасибо за возможные ответы или критику или даже игнор :)

Оффлайн DSA

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #18 : 14 Июля 2005, 11:54:46 »
Я вот впринципе подумал и мне на ум приходит только один вариант решения данной проблемы. Вот примерный алгоритм:
 1. Юзер вводит логин и пароль, нажимает ок.
 2. Скрипт проверяет пользователя по базе, если все ок, пользователь существует и пароль верен, то отправляем на главную страницу некого интерфейса.
 3. На главной странице создается сессия выше указанным способом(если кукиса нет,то создаем, если есть,пользуемся текущей).
 4. Далее, допустим,при перемещении в какой-либо секретный раздел(тоесть раздел защищенного интерфейса), то мы делаем следующее:
        4.1  Проверяем пользователя кукисы. Записываем кукис с именем CGISESSID в некую переменную (если он есть). Эта часть кода у меня так выглядит:

my $sid = $cgi->cookie("CGISESSID") || undef;

if ($sid) {
 my $session = new CGI::Session(undef, $cgi, {Directory=>\'Z:/tmp\'});
 print "Okey!
";
 print "Session->ID = ", $session->id(), "
;
} else {
 print "nefiga :(
";
}

Вот и все. Но мне почему-то кажеться что существует какой-то другой, более элегантный способ проверки.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #19 : 14 Июля 2005, 15:07:03 »
Цитировать
DSA:
Простите пожалуйста что вмешиваюсь в вашу беседу,но меня тоже очень интересует принцип использования сессий (в моем случае для авторизации/аутентификации на сайте) с помощью модуля CGI::Session. А проблема моя заклчается в том, что я, даже после прочтения здаровенного мануала(туториала), так и не понял, каким образом можно/нужно проверять является ли пользователь "хозяином" сессии? (т.е. тем,кто ее изначально создал в том виде и с тем ключом, с которым она есть).

почитай то что я подробно написал в этом топике выше (с прмером):
http://forums.webscript.ru/showthread.php?s=&postid=129870#post129870

Как определяется пользователь владелец сессии? По sid - ид-ру сессии
Цитировать
DSA:
Вот и все. Но мне почему-то кажеться что существует какой-то другой, более элегантный способ проверки.

да, потому как все это делает CGI::Session самостоятельно (метода load , new)
В том числе и отправку куков, модуль делает сам $session->header
почитайте мой пост выше я там подробно расписал это
 в исканиях.

Оффлайн DSA

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #20 : 14 Июля 2005, 23:32:18 »
Большое спасибо за ответ, Зеленый Какаду! :-)
Мне очень понравился ваш развернутый, подробный ответ, но я почему-то не нашел в перловой документации ничего про метод load, да и при попытке использовать его в скрипте перл ругается:

Can\'t locate auto/CGI/Session/load.al in @INC (@INC contains: z:/usr/lib z:/usr/
site/lib .) at xxx.pl line 7

Не могли бы ли вы прислать его мне на мыло mailbest@ru.ru либо скинуть прямо сюда в виде открытого кода? (я думаю он будет не большой по содержанию), я был бы очень признателен.

Кстати, вы писали, что вас лично модуль CGI::Session не устраивает, т.к. "Вместо простых SQL запросов для проверки времени истечения жизни сессии, он выбирает конкретную запись ,восстанавливает сериализованные данные и потом смотрит." - а нельзя ли написать собственную функцию отчистки базы от "мертвых" сессий? Тоесть срок действия которых давно истек.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #21 : 15 Июля 2005, 00:36:33 »
Цитировать
DSA:
ничего про метод load, да и при попытке использовать его в скрипте перл ругается:

Can\'t locate auto/CGI/Session/load.al in @INC (@INC contains: z:/usr/lib z:/usr/ site/lib .) at xxx.pl line 7

сорри :) не сказал, что я смотрел уже новую версию (она еще в процессе разработки):
http://search.cpan.org/~sherzodr/CGI-Session-4.00_08/

Цитировать
DSA:
Кстати, вы писали, что вас лично модуль CGI::Session не устраивает, т.к. "Вместо простых SQL запросов для проверки времени истечения жизни сессии, он выбирает конкретную запись ,восстанавливает сериализованные данные и потом смотрит." - а нельзя ли написать собственную функцию отчистки базы от "мертвых" сессий? Тоесть срок действия которых давно истек.

можно конечно, только это будет мягко говоря "не опримальный" вариант:
т.к. дата истечения хранится в хеше, который в свою очередь через Dump/Storable превращен в строку текста, то придется вытаскивать данные a_session для каждой сессии,восстанавливать эти данные, проверять время истечения и потом уже если оно истекло удалять.
Самый лучший вариант вынести это в отдельное поле (т.е. переписать некоторые методы CGI::Session::Driver::mysql + добавить парочку своих для массовой проверки/удаления), но ИМХО проще тогда написать свой вариант.
 в исканиях.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #22 : 15 Июля 2005, 00:44:46 »
Цитировать
Green Kakadu:
Самый лучший вариант вынести это в отдельное поле (т.е. переписать некоторые методы CGI::Session::Driver::mysql + добавить парочку своих для массовой проверки/удаления), но ИМХО проще тогда написать свой вариант.

оказывается это уже сделали (правда для PostgreSQL):
CGI::Session::PureSQL
Там используется таблица вида:
    -- This syntax for for Postgres; flavor to taste
    CREATE TABLE sessions (
        session_id               CHAR(32) NOT NULL,
                remote_addr              inet,
                creation_time    timestamp,
                last_access_time timestamp,
                duration                 interval
    );
 в исканиях.

Оффлайн DSA

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #23 : 15 Июля 2005, 14:45:59 »
Вау! Пасибки за ценнейшую информацию :) Пойду прямо сейчас обновлять свою 3-95 на 4 версию CGI::Session :)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28