Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Авторизация в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.203 c
15-1272270245
Дмитрий С
2010-04-26 12:24
2010.08.27
Честный многопоточный видеоконвертор?


15-1261482460
Piter
2009-12-22 14:47
2010.08.27
Win32/Kryptik троян подцепил


15-1264632229
Германн
2010-01-28 01:43
2010.08.27
RDTSC и её использование в VB 2008 Express Edition


8-1204554483
CHO
2008-03-03 17:28
2010.08.27
Overlay


2-1273173878
glikozid
2010-05-06 23:24
2010.08.27
Обращение к StringGrid из другой формы