Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Авторизация в DataSnap/SOAP   Найти похожие ветки 

 
DSKalugin   (2008-11-10 16:22) [0]

Делаю трёхзвенку на базе SOAP.
В серверной части (SoapDataModule) к датасету(qrRead) привязываю TDataSetProvider где Exported=True...
Не значит ли это, что доступ к qrRead теперь будет открыт абсолютно всем желающим т.е. не только своим, но и чужим?
Если да, то как реализовать авторизацию при подключении к серверным DataSetProvider-ам?
В TSoapConnection есть свойства UserName и Password, но насколько я понял они относятся к Proxy


 
clickmaker ©   (2008-11-10 16:43) [1]

авторизацию там своими средствами надо делать.
пишешь метод LogonUser, заводишь сессию
в методах, которые требуют авторизации, проверяешь, залогинен ли юзер
А по умолчанию там используется дефолтная http-авторизация, так же как, DCOM, к примеру, использует доменных юзеров


 
Сергей М. ©   (2008-11-10 16:46) [2]

IMyAppServerSOAP = interface(IAppServerSOAP)
..
  function Logon(User, Password, Role: MyType): MyLogonResult;
..
end;


 
DSKalugin   (2008-11-10 16:59) [3]

>http-авторизация
в качестве HTTP-сервера использую встроенный "индийский" (Indy) TIdHTTPWebBrokerBridge так что особо им не поуправляешь.

>в методах, которые требуют авторизации,
С этим все просто: в каждый такой метод добавить 2 параметра (юзер+пароль) или сессию

Вопрос в том как не подпустить чужаков к серверным DataSetProvider-ам?
Пока посматриваю в сторону OwnerData: OleVariant
BeforeExecute(Sender: TObject; var OwnerData: OleVariant);


 
DSKalugin ©   (2008-11-10 17:06) [4]

>Сергей М.
а какое отношение "function Logon" имеет к доступности всем ветрам серверного DataSetProvider-а?


 
Сергей М. ©   (2008-11-10 17:20) [5]


> DSKalugin ©   (10.11.08 17:06) [4]


Такое что доступность или недоступность волен определять ты сам в динамике (а не в статике, как это у тебя реализовано сейчас) после успешного или неуспешного прохождения авторизации в ходе вызова клиентом метода Logon интерфейса твоего апп-сервера


 
DSKalugin ©   (2008-11-10 17:33) [6]

цитата для Сергея из http://www.delphiplus.org/articles/delphi/soap_it_is_easy/

Основное условие при программировании SOAP: сервер должен быть stateless, т.е. результат выполнения запроса не должен зависеть от предыдущих команд, полученных сервером.
*********
нельзя одной командой передать параметры, а другой считать результат - все должно происходить в рамках одной команды


 
clickmaker ©   (2008-11-10 17:41) [7]

> [6] DSKalugin ©   (10.11.08 17:33)

SessionID = YourServer.LogonUser(...);

// some server method
function SomeMethod(ASessionID: integer; ...): integer;
begin
 if (ASessionID = 0) then begin
   Result := E_NOT_LOGGED_ON; //some constant
   Exit;
 end;
end;

как-то так


 
DSKalugin ©   (2008-11-10 18:40) [8]

Речь не о методах, ёмаё...
Попробую перефразировать вопрос иначе
Есть клиентская часть
TClientDataSet --> TSoapConnection -->"WWW"
Серверная

"WWW"  --> "WebService(Soap)" --> TDataSetProvider (Name="dspReader")--> TDataSet --> TDatabase....


на клиенте в коде пишу

{TClientDataSet}
 soapDM.cdsReader.Close;
 soapDM.cdsReader.RemoteServer:=SoapConnection;
 soapDM.cdsReader.ProviderName:="dspReader";
 soapDM.cdsReader.CommandText:="select * from myTable";
{TSoapConnection}
 soapDM.SoapConnection.URL:="http://MyWebService/SOAP";
 soapDM.SoapConnection.Connected:=True;
 try
   soapDM.cdsReader.Execute; // выполняю произвольный SQL
******

запрос из cdsReader.CommandText передается по всей цепочке в серверный TDataSet где и выполняется

Так вот мне нужно каким-то образом закрыть доступ к TDataSetProvider-у чтобы он не обрабатывал "чужие запросы"

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


 
Сергей М. ©   (2008-11-10 21:05) [9]


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


Видим, "ёмаё".

Но что мешает "чужому" клиенту заполучить исключение

soapDM.SoapConnection.Connected:=True;
try
  soapDM.cdsReader.Execute; // <- здесь


поскольку он не сделал

soapDM.SoapConnection.Connected:=True;
if IMyAppServerSOAP (SoapConnection.AppServer).Logon(..) then
try
  soapDM.cdsReader.Execute; // <- здесь


не видим. Ё-маё.


 
DSKalugin ©   (2008-11-10 22:08) [10]

это все клиентский код, а что нужно сделать на сервере, чтобы
здесь
soapDM.cdsReader.Execute; // <- здесь
заполучить исключение?
ведь между
IMyAppServerSOAP (SoapConnection.AppServer).Logon(..)
и
soapDM.cdsReader.Execute;
нет никакой связи т к Logon будет выполнен в одном серверном процессе, а отработка запроса - в другом, потому что SOAP работает как stateless


 
Сергей М. ©   (2008-11-11 08:25) [11]

Ты не понял. Или я неправильно объяснил.
На стороне апп-сервера никаких исключений не будет.

Апп-сервер выполняя вызванный клиентом метод Logon осуществляет аутентификацию клиента, и в случае успеха экспортирует те дейтасет-провайдеры, с которыми клиент имеет право работать.


> soapDM.SoapConnection


Что-то я не понял, что у тебя делает клиентский компонент SoapConnection в дейтамодуле на стороне апп-сервера ?


 
clickmaker ©   (2008-11-11 11:05) [12]

> Что-то я не понял, что у тебя делает клиентский компонент
> SoapConnection в дейтамодуле на стороне апп-сервера ?

да нет, это как раз-таки клиентский код.

Но я бы вообще отказался от прямого задания запроса через CommandText на стороне клиента. А делал бы все через методы, передавая имя провайдера


 
DSKalugin ©   (2008-11-11 11:14) [13]

soapDM.SoapConnection у меня на клиенте, естественно см (10.11.08 18:40) [8]

Да, что-то мы недопонимаем друг друга. В этом и есть недостаток электронного общения ;-)

Вопрос решен так (пока что)
// в клиендатасете передаю учетку
procedure TsoapDM.cdsReaderBeforeGetRecords(Sender: TObject;
 var OwnerData: OleVariant);
begin
 OwnerData:=VarArrayOf(["dimon", "654w3erg"]);
end;

//в сервере приложений DataSetProvider проверяю
procedure TsoapRDM.dspReaderBeforeGetRecords(Sender: TObject;
 var OwnerData: OleVariant);
var U, P: ShortString;
begin
 AppendLog("try dspReaderBeforeGetRecords"); // 4 test
 if not VarIsNull(OwnerData) and not VarIsClear(OwnerData) then
   try
     U:=OwnerData[0]; P:=OwnerData[1];
     CheckUserLogon(U, P); // <-- raise exception
   except
     AppendLog("unknown User");
     qrRead.Last;
   end
 else qrRead.Last;
end;

тобишь одним действием и авторизация и получение данных


 
Сергей М. ©   (2008-11-11 11:40) [14]


> clickmaker ©   (11.11.08 11:05) [12]


Я может и мартышка к старости, но читать пока не еще разучился)

Читаю справку:

Use a TSoapDataModule object as the central repository for all objects in a SOAP-based application server.
Typically these are data access components, such as datasets and the provider components that handle communication between these datasets and client applications

Просматриваю демо-проекты:

Search for "TSoapDataModule"
 C:\Program Files\Borland\Delphi7\Demos\WebServices\EchoService\Server\DataMod_U.pas(13):   TDataMod = class(TSoapDataModule, IDataMod, IAppServer)
 C:\Program Files\Borland\Delphi7\Demos\WebServices\SOAPDataModule\Server\DataMod_U.pas(14):   TDataMod = class(TSoapDataModule, IDataMod, IAppServerSOAP)
 C:\Program Files\Borland\Delphi7\Demos\WebServices\SOAPDataModule\Server\SOAPDMServerCGI.dpr(8):   DataMod_U in "DataMod_U.pas" {DataMod: TSoapDataModule},
 C:\Program Files\Borland\Delphi7\Demos\WebServices\SOAPDataModule\Server\SOAPDMServerWAD.dpr(10):   DataMod_U in "DataMod_U.pas" {DataMod: TSoapDataModule};

Нигде не вижу упоминаний того, что TSoapDataModule используется на клиентской стороне распределенного midas-приложения.


 
clickmaker ©   (2008-11-11 11:54) [15]

> [14] Сергей М. ©   (11.11.08 11:40)

да у него там может и обычный DataModule быть. Просто как контейнер для датасетов


 
Сергей М. ©   (2008-11-11 12:03) [16]


> Просто как контейнер для датасетов


A зачем его тогда обзывать soapDM ?


> тобишь одним действием и авторизация и получение данных


Кривовато, но суть одна и та же, что и при использовании специально реализованного метода аутентификации.


 
DSKalugin ©   (2008-11-26 17:29) [17]

TsoapDM. (клиентский ДМ, работающий с соап-ом)<> TsoapRDM. (серверный)

да уж действительно названия датамодулей подобрал почти одинаково (неудачно)


 
имя   (2008-11-30 13:14) [18]

Удалено модератором


 
ага   (2008-11-30 15:48) [19]

Удалено модератором


 
Ega23 ©   (2008-11-30 15:53) [20]


> И появляются на свет Авторитеты - уважамые люди. Уважаемые
> люди когопо пало в свой круг не пускают, они сами решают,
>  кто достоин уважения, а чье место под кроватью.


В рунете есть масса других форумов. С другой системой модерации. Бывают даже и без оной.


 
ага   (2008-11-30 16:18) [21]

To Ega23 ©

Да, я в курсе, спасибо. Да Вы не беспокойтесь, я воду здесь мутить не собираюсь, и без меня мутно. Это было что-то типа прощального привета.


 
sniknik ©   (2008-11-30 16:23) [22]

> Это было что-то типа прощального привета.
будем по тебе скучать... как и по любому "сделавшему ручкой" троллю. по таким лучше скучать чем общаться.


 
имя   (2009-04-20 23:18) [23]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.064 c
4-1234276707
Serafim
2009-02-10 17:38
2010.08.27
Не получается записать во входной буфер консоли WriteConsoleInput


6-1224709751
serko
2008-10-23 01:09
2010.08.27
Telnet через Delphi...


2-1274676640
viktooor
2010-05-24 08:50
2010.08.27
Запрет редактирование в Grid


15-1266979814
brother
2010-02-24 05:50
2010.08.27
IPv6


2-1268835906
user99834
2010-03-17 17:25
2010.08.27
Преобразовать BMP в JPEG, сжать и записать в TMemoryStream





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский