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

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

Оффлайн Inecs

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 48
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.amorphis-dg.da.ru
Господа, возник вот какой вопрос. Есть таблица (БД - MySql).
Структура её такова:
id (пользователя), name (‘имя пользователя’), pass (‘пароль’).
Как организовать аутентификацию пользователя с помощью CGI::Session. Желательно использую БД, а не файлы.
Если можно, то конкретный пример. За ранее спасибо.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #1 : 08 Июля 2005, 18:07:29 »
Цитировать
Inecs:
Есть таблица

имеется ввиду mysql.user? :)
ох, сейчас начнут вас отправлять в CGI::Session::Tutorial  и CGI::Session::CookBook. в лучшем случае. :)
Вот как в "разжеванной документации" (тут на форуме мне как-то написали, что мол в перлдок все расписано очень подробненько и нечего на форумах вопросы задавать):
To store session data in MySQL database, you first need to create a suitable table for it with the following command:
    CREATE TABLE sessions (
        id CHAR(32) NOT NULL UNIQUE,
        a_session TEXT NOT NULL
    );
You can also add any number of additional columns to the table, but the above "id\'\' and "a_session\'\' are required.

На этих подробностях я пока отложила решение вопроса авторизации. Но идея была таковой:
некто вводит в форму свои логин/пароль, соединяется с базой,
сохраняем сессию на диск и прописываем в таблицу sessions ИД пользователя и номер его сессии, а по ссылкам потом таскаем этот номер сессии или в кваери_стринг или в инпут тайп=хидден.
только не очень понятен механизм, удаления сессии, если например, пользователь поменял пароль. или вообще, что-либо поменял, при очередном входе.
интересный вы вопрос подняли. :)
пока-пока. :)

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #2 : 08 Июля 2005, 19:11:28 »
Цитировать
Inecs:
id (пользователя), name (‘имя пользователя’), pass (‘пароль’). Как организовать аутентификацию пользователя с помощью CGI::Session. Желательно использую БД, а не файлы.

отдельно использовать таблицу с данными CGI::Session.
После проверки сесии получаешь id пользователя (+любые другие данные сесии) и соответственно вытягиваешь все из своей БД.
Не стоит одно с другим накрепко связывать.

Цитировать
AnnA:
ох, сейчас начнут вас отправлять в CGI::Session::Tutorial и CGI::Session::CookBook.

именно так :) там все расписано.
 в исканиях.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #3 : 11 Июля 2005, 12:56:22 »
Green Kakadu да нет там нифига. :) извините.
я говорю именно про алгоритм - реализация не нужна: справлюсь.
Распишите пож-ста, если не сложно.
как я уже говорила - вижу это так:
1. зашел пользователь, подсоединился т.е. к базе (причем напрямую - из формы, а не из восстановленного по номеру сессии паролю. Это важно для случая, если пользователь поменял пароль).
2. считываем из базы номер сессии для этого пользователя
3. востанавливаем параметры сессии по номеру с винта.
   (их может быть много.. например... ну не знаю... например кол-во записей в базе, что бы показать сколько их добавилось или удалилось с последнего его визита).
4. сверяем с теми, что он передал в форме (например новый пароль: в базу он зашел с ним, а в сессии прописан еще старый, или язык веб-интерфейса)
  4а. если что-либо изменилось - удаляем текущую сессию, удаляем ее номер из базы, происываем новую на винт и запись о ней в базу - отдаем ему его интефейс
 4б. ничего не изменилось - отдаем ему его интерфейс.
--------------------
ну. вот так вот. слишком долго, ресурсоемко. нет?
а, если у меня в базе 50 пользователей, я открываю таблицу сессионс и что, - для КАЖДОГО пользователя в цикле давать права селект, делит, инсерт, апдейт? Или можно как-то сделать это сразу для всех?
Цитировать
Green Kakadu:
и соответственно вытягиваешь все из своей БД.

вы предлагаете все хранить в базе?! гм. тогда зачем мне вообще нужен модуль цги::сессион? ключ я и так могу сгенерить, это не проблема. нет. на мой взгляд - надо хранить именно в сессии. с ключем айпи-матч и еще какой-либо своей "чексамм". т.е. даже если узнают номер сессии (что не так уж и сложно) то пришлось бы постараться дабы пройти проверки в ней установленные.
ух. ;) вон сколько написала
пока-пока. :)

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #4 : 11 Июля 2005, 13:26:37 »
Цитировать
AnnA:
вы предлагаете все хранить в базе?! гм. тогда зачем мне вообще нужен модуль цги::сессион? ключ я и так могу сгенерить, это не проблема. нет. на мой взгляд - надо хранить именно в сессии. с ключем айпи-матч и еще какой-либо своей "чексамм". т.е. даже если узнают номер сессии (что не так уж и сложно) то пришлось бы постараться дабы пройти проверки в ней установленные.

там и так все хранится в базе. Причем это временное хранилище. Вы для сессии созраняете некоторые нужные вам данные, они сериализуются (Dump/Storable) и сохраняются.
А для того, чтоб не было проблем при смене пароля вы должны пользовательские данные (пароль, имя, настройки и т.д.) хранить в отдельном месте ,а не кидать их в таблицу где сохраняются сессии. К тому же сессии полезно подтирать с некоторой периодичностью.
Алгоритм примерно таков:
зашел пользователь, получили его sid, если такая есть, то вы знаете его id и можете из своих таблиц выбрать то, что нужно (или взять это из данных сессии).
Если sid не существует или устарела, то соответственно, он проходит процесс авторизации и вы создаете ему сессию.
Если он меняет какие-либо данные, вы вносите их (туда где хранятся данные пользователей, а не в сессию), удаляете старую сессию, открываете новую. Сессионные данные ВРЕМЕННЫЕ не стоит туда кидать что-то предназначенное для длительного хранения.
примерно так.
 в исканиях.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #5 : 11 Июля 2005, 15:44:51 »
Green Kakadu или мы о разном толкуем, или я вас не понимаю.
Цитировать
Green Kakadu:
там и так все хранится в базе.

да нет же. в базе храняится только пользовательский ИД и номер его сессии.
Цитировать
Green Kakadu:
А для того, чтоб не было проблем при смене пароля вы должны пользовательские данные (пароль, имя, настройки и т.д.) хранить в отдельном месте ,а не кидать их в таблицу где сохраняются сессии

нутк в таблице я и храню ТОЛЬКО номер сессии и ничего более.

Цитировать
Green Kakadu:
Если он меняет какие-либо данные, вы вносите их (туда где хранятся данные пользователей, а не в сессию), удаляете старую сессию, открываете новую.
Ну блин. А зачем мне тогда она вообще нужна эта сессия, если в ней только то и есть, что номерок? Да вы не злитесь, просто не могу понять зачем он мне вообще нужен - номер сессии, если все данные хранятся в БД? Тогда я могу "таскать за собой" по страницам, например ИД пользователя +1024 (например. причем число после + может меняться. это несложно реализовать). м?

Цитировать
Green Kakadu:
Сессионные данные ВРЕМЕННЫЕ не стоит туда кидать что-то предназначенное для длительного хранения.

"Временные" - имеется ввиду $session->expire(\'+1h\');? в ЛЮБОМ случае я получаю файл вида: cgisess_3d4799f72a9f3a20e8bf955687afabe3 вот из него я и пишу в базу ТОЛЬКО  sid -> 3d4799f72a9f3a20e8bf955687afabe3 т.е.
$dbh->do(qq{ insert into SESSIONS values ($user_id, $sid) }) or die $DBI::errstr;
$dbh->commit or die $DBI::errstr;
пока-пока. :)

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Конкретная задача. Сессии на Perl.
« Ответ #6 : 11 Июля 2005, 17:50:07 »
AnnA
Цитировать
"Временные" - имеется ввиду $session->expire(\'+1h\');? в ЛЮБОМ случае я получаю файл вида: cgisess_3d4799f72a9f3a20e8bf955687afabe3 вот из него я и пишу в базу ТОЛЬКО sid -> 3d4799f72a9f3a20e8bf955687afabe3 т.е.
$dbh->do(qq{ insert into SESSIONS values ($user_id, $sid) }) or die $DBI::errstr;
$dbh->commit or die $DBI::errstr;

мда...
"не понимание сути природы..."

зачем использовать файлы и при всем при этом ещё и БД чего то пихать?
Цитировать
Тогда я могу "таскать за собой" по страницам, например ИД пользователя +1024 (например. причем число после + может меняться. это несложно реализовать). м?

ну да... полностью согласен!
вот только маленькое но! если этих параметров с десяток? их тоже будешь с собой по страницам тоскать?
« Последнее редактирование: 11 Июля 2005, 17:56:35 от commander »
And no religion too...

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #7 : 11 Июля 2005, 23:09:34 »
По порядочку. Причем файлы если данные сессии хранятся в БД?
По умолчанию, CGI::Session использует для хранилища файлы, но никто не мешает использовать

БД:
Создаем для этого таблицу:

CREATE TABLE my_sessions (
        id CHAR(32) NOT NULL UNIQUE,
        a_session TEXT NOT NULL
    );

Что тут хранится?
id - уникальный ключ (32 байта) Сгенерированный MD5, SHA1 или способом дедушки на кухне

(модуль Session::ID::Incr)
a_session - это не ид пользователя ,а сериализованные данные (хеш)  в котором хранятся время

жизни, ip (если есть) и т.д. + ПО желанию вы можете внести туда что-то свое через метод

param. Сериализуется все по умолчанию через Data::Dumper (Storable побыстрее, так что если

установлен, то возможно стоит его использовать, задается при создании сессии)

Таблица есть, теперь делаем такие движения:

use CGI::Session;
use CGI qw/:cgi/;
my $cgi = new CGI;
#по умолчанию таблица называется sessions
# если у вас не так, то надо указать имя таблицы:
$CGI::Session::MySQL::TABLE_NAME = \'my_sessions\';
# далее вызываем объект сессии. Если она есть и ее срок не истек, то сответственно получаете

#параметры ессии, если истек или ее нет, то автоматом открывается новая
# Нам он НЕ очень нужен :)
my $s = new CGI::Session("driver:MySQL", $cgi, {Handle=>$dbh});

#Используем это:
#Альтернативный способ "без автоматов" сойдет для авторизации - метод load
my $s = CGI::Session->load("driver:MySQL", $cgi, {Handle=>$dbh});
#проверяем срок годности:
if ( $s->is_expired ) {
#если устарела
   $s->delete();#удаляем ее, чтоб не засорять
        &login;#пусть логинится
        exit(0);
}
    if ( $s->is_empty ) {
   # если ее вообще нет, то пусть тоже логинится
       &login;#пусть логинится
        exit(0);
}
# все кривые ушли на авторизацию, остались живые
# можем получить нужные параметры
my $user_id = $s->param(\'user_id\');#если он конечно нужен
#зададим какой-нибудь параметр:
$s->param(\'my_param\',\'Хоу ду ю ду миссис Джейн?\');
#делаем что угодно, хотя это нам на самом деле и не нужно

# НО нужно продлить время жизни
$s->expire(\'+2h\');#продлеваем время жизни сессии на пару часов
# время жизни сохраняется и в БД, не только в куках
# куки нам вообще неинтересны
#ля-ля-ля
# Только когда будете отдавать пользователю страницу, не забудьте вначале послать заголовки
print $s->header();

При авторизации, вы проверяете пароль, логин и если все прошло успешно, создаете новую

сессию
my $s = new CGI::Session("driver:MySQL", $cgi, {Handle=>$dbh});

Примерно так.

В куках передается только sid и ничего более, все остальное хранится на стороне сервера.
И хранить там из своего по-моему надо только id пользователя, чтоб его опознать и получить

по этому id данные которые хранятся уже в ваших хранилищах (не важно где)
Можно на несколько разных скриптов использовать одну таблицу сессий ,просто разные скрипты

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

CGI::Session - это не инструмент для сохранения пользовательских данных, это лишь инструмент

для временного (в течении сеанса или нескольких сеансов) сохранения временных данных с

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

Лично мне CGI::Session не понравился по нескольким причинам, если говорить о БД:
 универсальность хранения (или в файлах или в БД как хотите) делает его хромым при работе с

БД. Вместо простых SQL запросов для проверки времени истечения жизни сессии, он выбирает

конкретную запись ,восстанавливает сериализованные данные и потом смотрит. Намного лучше,

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

устаревшие сессии, а иначе происходит накопление "мертвых" сессий (один раз вас юзер посетил

, вы ему сделали сессию, и он никогда не вернулся, а в БД запись висит).
Поэтому лучше написать и использовать что-то свое. В случае файлов это не так критично, хотя

тоже захламляется.
Сессии нужно подтирать - это как стикер, написал, повесил на холодильник, через день

прочитал и выкинул. Если понадобилось - взял новую бумажку и там опять накалякал.

P.S. Сорри, если сумбурно, но на развернутуе сочинение how-to пока времени не хватает ,может

соберусь как нибудь..
 в исканиях.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Конкретная задача. Сессии на Perl.
« Ответ #8 : 12 Июля 2005, 09:42:10 »
Green Kakadu
Цитировать
Лично мне CGI::Session не понравился

как это знакомо... :) я вообще от готовый решений отказался... свой написал...
And no religion too...

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #9 : 12 Июля 2005, 11:14:12 »
Цитировать
commander:
если этих параметров с десяток?

да хоть с двадцаток. речь шла о том, что ВСЕ параметры хранятся в БАЗЕ. а по страницам передавать только "например ИД пользователя +1024". зачем писать "хоть что-то", если нечего добавить по сути вопроса. непонятно. именно, что
Цитировать
commander:
"не понимание сути природы..."

Green Kakadu respect. "Разжевали, как ребёнку". :super: :chmok:
пока-пока. :)

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Конкретная задача. Сессии на Perl.
« Ответ #10 : 12 Июля 2005, 11:22:04 »
AnnA
Цитировать
что ВСЕ параметры хранятся в БАЗЕ. а по страницам передавать только "например ИД пользователя +1024"

а чем простите тогда у вашего метода принцепиальное отличие от сессий? :)
Цитировать
зачем писать "хоть что-то", если нечего добавить по сути вопроса.

по сути вопроса мне есть что добавить... по этому и пишу... вы в ввиду, видимо своей некомпетентности, пытаетесь изобрести велосипед да ещё и с квадратными колёсами... а я пытаюсь вас предостеречь от этого... не более того...
to moderators:
sorry за флэйм....
And no religion too...

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Конкретная задача. Сессии на Perl.
« Ответ #11 : 12 Июля 2005, 12:29:23 »
[moderator]
Я внимательно смотрю за этой веткой.
Постарайтесь держать себя в рамках.
The documentations is your friend

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #12 : 12 Июля 2005, 13:35:40 »
Цитировать
AnnA:
да хоть с двадцаток. речь шла о том, что ВСЕ параметры хранятся в БАЗЕ. а по страницам передавать только "например ИД пользователя +1024".

ничем. поэтому вы сами можете написать нечто ,что будет работать лучше. Передается только sid, он хранится в куках (а можно и по ссылкам таскать)
У CGI::Session просто название такое хорошее, тогда как стандартным модулем для работы с сессиями он не является :)
 в исканиях.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Конкретная задача. Сессии на Perl.
« Ответ #13 : 12 Июля 2005, 13:35:40 »
дык а тут в общем-то теперь все понятненько. может и не всем, конечно. ;)
Green Kakadu а можно узнать ваше мнение/отношение об/к Apache::Session::MySQL?
насколько я поняла при беглом чтении документации - принцип приблизительно одинаков и для авторизации действительно  
Цитировать
Green Kakadu:
лучше написать и использовать что-то свое


commander извините - у меня нет желания с вами препираться, а по сути вопроса вы так ничего и не сказали. :) спасибо большое за предостережения, но я, в общем-то пытаюсь лишь понять принцип/алгоритм, а вовсе не создавать велосипед.
пока-пока. :)

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Конкретная задача. Сессии на Perl.
« Ответ #14 : 12 Июля 2005, 13:41:38 »
Цитировать
AnnA:
Green Kakadu а можно узнать ваше мнение/отношение об/к Apache::Session::MySQL?

ничего сказать не могу, не использовал :(
если будете выбирать механизм для поддержки сессий то прежде всего посмотрите на воз-ть очистки (массовой) мертвых сессий, срок которых истек. По идее это один sql запрос на удаление всех сессий у которых поле "срока годности" истекло.
 в исканиях.

 

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