Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос про авторизацию Web пользователей для Sybase SA. / 6 сообщений из 6, страница 1 из 1
09.09.2008, 19:28
    #35530729
Stalker4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про авторизацию Web пользователей для Sybase SA.
Привет всезнающий All,

Есть raw-web сервис, который требует авторизации:

Код: plaintext
CREATE SERVICE "Web1" TYPE 'RAW' AUTHORIZATION ON AS call dba.Test1();

Этот сервис, с помощью процедуры dba.Test1(), возвращает html
следующего вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
 <meta http-equiv="Cache-Control" content="no-cache">
 <meta http-equiv="Pragma" content="no-cache">
</head>

<frameset rows="35%,65%">
<frame name="where" src="http://localhost/Web2">

<frame name="select" src="http://localhost/Web3">
</frameset>

</body>
</html>

Web2 и Web3 тоже сервисы, которые требуют авторизации:

Код: plaintext
1.
CREATE SERVICE "Web2" TYPE 'RAW' AUTHORIZATION ON AS call dba.Test2();
CREATE SERVICE "Web3" TYPE 'RAW' AUTHORIZATION ON AS call dba.Test3();

Каждый из этих сервисов возвращает свою html, которая отображается в
соответствующем фрейме.

Запускаю бразуер, например SeaMonky, и ввожу в адресной строке
http://localhost/Web1
Появляется окно браузера, куда я ввожу имя и пароль пользователя для
авторизации.

После этого в браузера отображается html из Web1, которая в свою очередь
вызывает Web2 и Web3 для отображения своих частей html.

Так вот, в половине случаев в верхнем или нижнем фрейме вместо нужной
html, отображается системная SA-html с ошибкой 401 (Authorization
Required). Но если в этом фрейме в контекстном меню выбрать пункт
"Обновить фрейм", то без всяких окон запроса логина, отображается нужная
html страница.

То есть получается, что веденные мною имя и пароль, где то во временной
памяти браузера сохраняются, так как при выбранном "Обновить фрейм"
все таки отображается моя html страница, без дополнительного логина.
Но почему веденные мною имя и пароль, при старте основного сервиса Web1 с
фреймом не всегда передаются двум другим сервисам (Web2 и Web3) мне не
понятно.

Может быть я что то неправильно делаю ?
Или может быть это ошибка SA ?

P.S. Пробовал в IE, там тоже самое.
...
Рейтинг: 0 / 0
11.09.2008, 15:29
    #35534418
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про авторизацию Web пользователей для Sybase SA.
Это скорее ошибка использования фреймов
попробуй вместо
"http://localhost/Web2"
поставить "/Web2"

еще проблема может возникнуть из-за кеша

например "Web1" закешился соответственно запрос к Web2 посылается без авторизации.
вижу что стоит <meta http-equiv="Pragma" content="no-cache"> но...
...
Рейтинг: 0 / 0
11.09.2008, 18:47
    #35535061
Stalker4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про авторизацию Web пользователей для Sybase SA.
Dmitry..Это скорее ошибка использования фреймов
попробуй вместо
"http://localhost/Web2"
поставить "/Web2"
Если я просто поставлю "/Web2", то как браузер будет знать с какого вызывать ссылку ?

По поводу фразы "ошибка использования фреймов": Это моя ошибка или это ошибка самого браузера ? Если моя, то в чем она заключается ?

Dmitry..
еще проблема может возникнуть из-за кеша
например "Web1" закешился соответственно запрос к Web2 посылается без авторизации.
вижу что стоит <meta http-equiv="Pragma" content="no-cache"> но...Насчет кеша у меня тоже есть сильные подозрения, но что тут можно сделать кроме запрета кеширования в самом браузере и соответствующего указания в заголовке я не знаю.
...
Рейтинг: 0 / 0
11.09.2008, 18:59
    #35535080
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про авторизацию Web пользователей для Sybase SA.
Stalker4 Dmitry..Это скорее ошибка использования фреймов
попробуй вместо
"http://localhost/Web2"
поставить "/Web2"
Если я просто поставлю "/Web2", то как браузер будет знать с какого вызывать ссылку ?Это естественное свойство браузеров, работать с относительными путями.
...
Рейтинг: 0 / 0
12.09.2008, 08:18
    #35535510
old_joy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про авторизацию Web пользователей для Sybase SA.
У меня три типа страниц на сайте:
статические
статические в течение недели
динамические

Сайт работает под Apache
Для динамических страниц стоит передресация на SA, и никто о существовании SA Не догадывается:

<IfModule mod_proxy.c>
ProxyRequests On
ProxyPass /spr/spr_html/search/ https://192.168.65.1/
ProxyPassReverse /spr/spr_html/search/ https://192.168.65.1/
ProxyPass /zav/ https://192.168.65.1/
ProxyPassReverse /zav/ https://192.168.65.1/
SSLProxyEngine on

Один раз в неделю SA по EVENT в течение 10 минут формирует порядка 2-3 тыс. html-страниц. Можно делать и чаще, но надобности в этом не вижу.

Статические страницы висят на Apache и никому не мешают.

Авторизация сделана только для динамических страниц через Cookie.

На каждой страничке стоит
автор if DBA.ssl_page_init(*) = -1 then
return
end if;
Вот вся обработка:
авторALTER FUNCTION "DBA"."ssl_page_init"(in tt smallint default 1)
returns smallint //Если любой параметр, кроме 1, проверяем только тайм-аут или первый вход
begin
declare cid smallint;
declare timeOut smallint;
//Читаем куку
set cid=DBA.http_cookie('session');
//Если куки нет (таймаут или первый вход)
//или имя-пароль неверные
//или пользователь сразу запросил login.stml
if cid is null or(cid = 0 and tt = 1) then
set cid=-1;
call dbo.sa_set_http_header('Refresh','0; URL='+dba.html_path(2)+'/init.stml')
else
//если все нормально
//Только здесь указывается общее время куки
set timeOut=600;
call DBA.set_http_cookie('session',cid,timeOut);
end if;
return(cid)
end;
авторALTER FUNCTION "DBA"."http_cookie"(in name varchar(250))
returns long varchar
begin
//Первые 19 символов куки - время окончания ее действия
declare i integer;
declare str long varchar; -- переменная, содержащая значение cookie
set str=http_header('Cookie');
if str is not null then
set name=name || '='; -- для поиска подстроки 'name='
set i=charindex(name,str);
if i > 0 then
set str=substr(str,i+length(name));
set i=charindex(';',str);
if i > 0 then
set str="left"(str,i)
end if;
set str=base64_decode(str);
//Проверяем время куки
if cast(substr(str,1,19) as timestamp) > current timestamp then
set str=substr(str,20)
else
set str=null
end if
else
set str=null
end if
end if;
return str
end
авторALTER PROCEDURE "DBA"."ssl_init"()
result(chtml long varchar)
begin
declare chtml long varchar;
//ID пользователя
declare cid smallint;
set cid=DBA.http_cookie('session');
call dba.html_head_c();
set chtml='<HTML>';
set chtml=chtml+'<head><TITLE>Инициализация пользователя</TITLE></head>';
set chtml=chtml+'<BODY bgcolor="#C0C0C0"><Center>';
set chtml=chtml+'<H1>Ввод имени пользователя и пароля</H1>';
if cid = 0 then
set chtml=chtml+'Неверное имя пользователя или пароль'
else
set chtml=chtml+'Если Вы попали на эту страницу, то вы либо только что зашли на сайт, <br>';
set chtml=chtml+'либо за последние 10 минут не запрашивали никакой информации.'
end if;
set chtml=chtml+'<form method="POST" action="'+DBA.html_path(2)+'/login.stml">';
set chtml=chtml+'<p><input type="text" name="cid" size="10"></p>';
set chtml=chtml+'<p><input type="password" name="cpass" size="10"></p>';
set chtml=chtml+'<p><input type="submit" value="Найти" name="B1"></p>';
set chtml=chtml+'<p><input type="reset" value="Отменить" name="B2"></p></Center>';
set chtml=chtml+'</form>';
set chtml=chtml+rtrim(dba.html_notes(1));
set chtml=chtml+'</BODY></HTML>';
//Устанавливаем cookie
call DBA.set_http_cookie('session',0,0);
select chtml
end
авторALTER PROCEDURE "DBA"."ssl_login"()
result(chtml long varchar)
begin
//Страничка login.stml для приема имени пользователя-пароля из формы
declare chtml long varchar;
declare cid smallint;
declare cname char(10);
declare cpass char(10);
//declare timeOut smallint;
//Пользователь может запросить login, минуя init
//проверяем только таймаут
if DBA.ssl_page_init(2) = -1 then
return
end if;
set chtml='<html><head><TITLE>Инициализация</TITLE>';
set cname=HTTP_VARIABLE('cid');
set cpass=HTTP_VARIABLE('cpass');
insert into DBA.zona_protokol( "login",pass) values( cname,cpass) ;
select id into cid from
DBA.zona_dostup where
"login" = cname and pass = cpass;
//Если такого пользователя или пароля нет
if cid is null then
call dbo.sa_set_http_header('Refresh','0; URL='+dba.html_path(2)+'/init.stml');
call DBA.set_http_cookie('session',0,0)
else
call DBA.set_http_cookie('session',cid,0);
call dbo.sa_set_http_header('Refresh','0; URL='+dba.html_path(2)+'/index.stml')
end if;
set chtml=chtml+'</head><BODY></BODY></HTML>';
select chtml
end
авторALTER PROCEDURE "DBA"."set_http_cookie"(name varchar(250),value smallint,max_age smallint,path varchar(250) default '/')
-- cookie удаляется после указанного числа секунд
begin
//Первые 19 символов значения куки - время окончания
//действия куки.
declare ctime char(19);
declare bin long varchar;
if max_age = 0 then
set ctime=string(days(current timestamp,1))
else
set ctime=string(seconds(current timestamp,max_age))
end if;
set bin=ctime || string(value);
set bin=base64_encode(bin);
call dbo.sa_set_http_header('Set-Cookie',
name || '=' || bin || ';' || ' path=' ||
path || ';')
-- Можно также указать domain=...; comment=....; и т.д.
end
Смысла работать с php, имея SA не вижу.
...
Рейтинг: 0 / 0
15.09.2008, 19:40
    #35540621
Stalker4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про авторизацию Web пользователей для Sybase SA.
2old_joy: Твой совет мне примерно понятен, но для моего случая он излишне сложен и не совсем мне походит.

DmitryЭто скорее ошибка использования фреймов
попробуй вместо
"http://localhost/Web2"
поставить "/Web2"Попробовал. Так же я отказался от использования localhost, прописав в host файле в винде
<мой ip> <мое имя>
соответственно теперь я захожу на свой web-сервис: http://<мое имя>/Web1

Так же, по совету ASCRUS я попробовал следующее: В дополнении к тому, что уже я описал выше, я завел еще один web-сервис с авторизацией Web0, который возвращает простую html с безусловной ссылкой (через мета-тег refresh с нулевой задержкой) на Web1 с фреймами.
Так же я попробовал вместо безусловной ссылки в Web0, сделать ссылку через <a href=...>.

Во всех случаях результат отрицательный: В верхнем или нижнем фрейме, при первоначальном старте получаю крик "401 Authorization Required".

Небольшое дополнение: Описанные выше проблема происходит, только если я соединяюсь с базой под именем пользователя отличным от "dba".

Вот скрипт, который создает SP, сервисы и пользователя (под которым надо заходить из браузера) для демонстрации этой проблемы:
Код: plaintext
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
CREATE PROCEDURE dba.TestWeb1()
result (html_document long varchar)
BEGIN

 declare res long varchar;

 set res = '<html>\n<head>\n';
 set res = res || '<title>Test Frame Site</title>\n';
 set res = res || '</head>\n';
 set res = res || '<frameset rows="35%,65%">\n';
 set res = res || '<frame name="where" src="/Web2">\n';
 set res = res || '<frame name="select" src="/Web3">\n';
 set res = res || '</frameset>\n';
 set res = res || '</html>';

 call dbo.sa_set_http_header('Content-Type', 'text/html; charset=windows-1251');
 call dbo.sa_set_http_header('Pragma', 'no-cache');
 call dbo.sa_set_http_header('Cache-Control', 'no-cache');

 select res;

END
go

CREATE PROCEDURE dba.TestWeb2()
result (html_document long varchar)
BEGIN

 declare res long varchar;

 set res = '<html>\n<head>\n';
 set res = res || '</head>\n<body>\n';
 set res = res || 'Russian Text Top Frame\n';
 set res = res || '</body>\n</html>';

 call dbo.sa_set_http_header('Content-Type', 'text/html; charset=windows-1251');
 call dbo.sa_set_http_header('Pragma', 'no-cache');
 call dbo.sa_set_http_header('Cache-Control', 'no-cache');

 select res;

END
go

CREATE PROCEDURE dba.TestWeb3()
result (html_document long varchar)
BEGIN

 declare res long varchar;

 set res = '<html>\n<head>\n';
 set res = res || '</head>\n<body>\n';
 set res = res || 'Russian Text Bottom Frame\n';
 set res = res || '</body>\n</html>';

 call dbo.sa_set_http_header('Content-Type', 'text/html; charset=windows-1251');
 call dbo.sa_set_http_header('Pragma', 'no-cache');
 call dbo.sa_set_http_header('Cache-Control', 'no-cache');

 select res;

END
go

CREATE SERVICE "Web1" TYPE 'RAW' AUTHORIZATION ON AS call dba.TestWeb1();
CREATE SERVICE "Web2" TYPE 'RAW' AUTHORIZATION ON AS call dba.TestWeb2();
CREATE SERVICE "Web3" TYPE 'RAW' AUTHORIZATION ON AS call dba.TestWeb3();

CREATE USER "UserWeb1" IDENTIFIED BY '123';
GRANT EXECUTE ON "DBA"."TestWeb1" TO "UserWeb1";
GRANT EXECUTE ON "DBA"."TestWeb2" TO "UserWeb1";
GRANT EXECUTE ON "DBA"."TestWeb3" TO "UserWeb1";

Может у All появятся еще идеи, как можно решить эту проблему ?
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос про авторизацию Web пользователей для Sybase SA. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]