Forum Webscript.Ru
Программирование => Perl => Тема начата: Kwazar от 13 Января 2005, 12:01:52
-
Я уже давно использую авторизацию вот такого принципа:
При успешной проверке логин а пароля пользователю пишутся куки с логином пользователи и его сессией
print "Set-Cookie: id=$id; expires=.date()+3600*24*100; path=/;\\n";
print "Set-Cookie: sess=$sess; expires=.date()+3600*24*100; path=/;\\n";
И в дальнейшем, при каждом обращении к пользовательской части сайта я вытягиваю эти куки с сверяю их с теми, что записаны в БД
$cookhttp= $ENV{\'HTTP_COOKIE\'} || $ENV{\'COOKIE\'};
@cookies = split (/\\; /,$cookhttp);
foreach $cookies (@cookies)
{
($n, $value) = split(/=/, $cookies);
$n =~ tr/+/ /;
$n =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$C{$n} = $value;
}
#$C{id} - id пользователя
#$C{sess} - сессия пользователя
Однако, приблизительно 20% пользователей с включенными кукисами ругаются, что не могут после успешной авторизации работать с сайтом, так как их опять выбрасывает на форму авторизации со словами о том, что вы не авторизованы.
Посмотрите пожалуйста приведенные коды. Все пролез, вроде все правильно. Но ведь работает через раз! Почему? Нутром чувствую, что что-то не так с записью или чтением кукисов
-
Kwazar
таскай сессию через параметры... и всё будет ок...
-
commander:
таскай сессию через параметры... и всё будет ок...
правда такой вариант местами утомителен.
CGI::Auth (http://search.cpan.org/author/CCWALLACE/CGI-Auth-3.00/Auth.pm)
-
commander
Они не очень желательны.
-
правда такой вариант местами утомителен.
зато надёжный! и у всех работает... не зависимо от куки...
-
Kwazar:
Нутром чувствую, что что-то не так с записью или чтением кукисов
ну используй тогда стандартные проверенные решения
CGI::Session или работай с ними через тот же CGI.pm
-
ИМХО, серверный вариант надежней. Нежели "клиентское разноообразие" куков (или кукисов, а как правильно?)
-
Mog.
А что подразумевается под фразой: "серверный вариант"?
Базовая авторизация?
Тогда сразу 2 вопроса:
1)Как ее повесить на БД и не хранить пользователей в .htpasswd?
2)Как выводить скрипты, которые только проверяют, авторизован клиент или нет? (например, общие описаловки с различными меню для авторизованных и не авторизованных пользователей)?
-
Kwazar
Сессии.
Хотя не поручусь за модули, че они там используют.
-
Mog.:
ИМХО, серверный вариант надежней
ты про
my $login=$ENV{\'REMOTE_USER\'};
или что-то еще?
-
Green Kakadu
Я про вообще.
-
В процессе размышлений родилось решение передавать сессию пользователя через get, используя Mod_rewrite для большей читабельности поисковиками. Жаль, конечно, что сессию не спрячешь в этом варианте решения и не сделаешь постоянной (без новой авторизации при повторном посещении сайта)
-
Kwazar:
get, используя Mod_rewrite для большей читабельности поисковиками.
а при чем тут поисковики, если раздел _для авторизованных пользователей_
-
Green Kakadu
Есть еще и общие скрипты, которые только проверяют, авторизован клиент или нет (и в зависимости от этого выводят или не выводят личное меню). Но при этом эти же скрипты доступны и для остальных.
-
Kwazar
о чем вообще тут полемику разводить? сессию можно либо таскать параметрами, либо хранить в куках, если куки не устраивают, остаеться только таскать сессию параметрами... и баста.
-
Kwazar:
В процессе размышлений родилось решение передавать сессию пользователя через get, используя Mod_rewrite для большей читабельности поисковиками.
вобще-то желательно писать так, чтобы поисковик вообще не получал идентификатор сессии. Иначе все юзеры, которые зайдут к тебе через поисковик будут работать под одной сессией (если скриптом не предусмотреть это)
-
Не читал всю тему, но может проблема в том, что плюшки поставленные для domen.com не работают для http://www.domen.com?
-
Kwazar:
print "Set-Cookie: id=$id; expires=.date()+3600*24*100; path=/;\\n";print "Set-Cookie: sess=$sess; expires=.date()+3600*24*100; path=/;\\n";
1. параметер expires указан неверно
2. при установке expires также полезно в заголовке высылать параметер Date, чтобы броузеру было от чего отчитывать
Рекомендация: при явном нежелании вникать в http протокол, рекомендую всё же воспользоваться готовым софтом для работы с заголовками а не пытаться сделать это самому
-
Kwazar
А я еще прописываю домен.
Так как у меня на некоторых сайтах ссылки относительные, поэтому сайт прекрасно работает как под доменом mysite.ru так и под доменом http://www.mysite.ru. поэтому во время авторизации я прописываю куки для обоих доменов одновременно.
Потом expires я всегда указываю максимальный, ты же сессию прописываешь, зачем тепе время её жизни у пользователя... определяй её время жизни на сервере. А то что у пользователя она пожизненная - неимеет значения.