|
|
|
Вопрос про авторизацию Web пользователей для Sybase SA.
|
|||
|---|---|---|---|
|
#18+
Привет всезнающий All, Есть raw-web сервис, который требует авторизации: Код: plaintext Этот сервис, с помощью процедуры dba.Test1(), возвращает html следующего вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Web2 и Web3 тоже сервисы, которые требуют авторизации: Код: plaintext 1. Каждый из этих сервисов возвращает свою 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, там тоже самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 19:28 |
|
||
|
Вопрос про авторизацию Web пользователей для Sybase SA.
|
|||
|---|---|---|---|
|
#18+
Это скорее ошибка использования фреймов попробуй вместо "http://localhost/Web2" поставить "/Web2" еще проблема может возникнуть из-за кеша например "Web1" закешился соответственно запрос к Web2 посылается без авторизации. вижу что стоит <meta http-equiv="Pragma" content="no-cache"> но... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:29 |
|
||
|
Вопрос про авторизацию Web пользователей для Sybase SA.
|
|||
|---|---|---|---|
|
#18+
Dmitry..Это скорее ошибка использования фреймов попробуй вместо "http://localhost/Web2" поставить "/Web2" Если я просто поставлю "/Web2", то как браузер будет знать с какого вызывать ссылку ? По поводу фразы "ошибка использования фреймов": Это моя ошибка или это ошибка самого браузера ? Если моя, то в чем она заключается ? Dmitry.. еще проблема может возникнуть из-за кеша например "Web1" закешился соответственно запрос к Web2 посылается без авторизации. вижу что стоит <meta http-equiv="Pragma" content="no-cache"> но...Насчет кеша у меня тоже есть сильные подозрения, но что тут можно сделать кроме запрета кеширования в самом браузере и соответствующего указания в заголовке я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 18:47 |
|
||
|
Вопрос про авторизацию Web пользователей для Sybase SA.
|
|||
|---|---|---|---|
|
#18+
Stalker4 Dmitry..Это скорее ошибка использования фреймов попробуй вместо "http://localhost/Web2" поставить "/Web2" Если я просто поставлю "/Web2", то как браузер будет знать с какого вызывать ссылку ?Это естественное свойство браузеров, работать с относительными путями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 18:59 |
|
||
|
Вопрос про авторизацию Web пользователей для Sybase SA.
|
|||
|---|---|---|---|
|
#18+
У меня три типа страниц на сайте: статические статические в течение недели динамические Сайт работает под 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 не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2008, 08:18 |
|
||
|
Вопрос про авторизацию Web пользователей для Sybase SA.
|
|||
|---|---|---|---|
|
#18+
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. Может у All появятся еще идеи, как можно решить эту проблему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2008, 19:40 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35535061&tid=2011387]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 385ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...