Конференция "Базы" » Авторизация в DataSnap/SOAP [D7, FB 155]
 
  • DSKalugin (10.11.08 16:22) [0]
    Делаю трёхзвенку на базе SOAP.
    В серверной части (SoapDataModule) к датасету(qrRead) привязываю TDataSetProvider где Exported=True...
    Не значит ли это, что доступ к qrRead теперь будет открыт абсолютно всем желающим т.е. не только своим, но и чужим?
    Если да, то как реализовать авторизацию при подключении к серверным DataSetProvider-ам?
    В TSoapConnection есть свойства UserName и Password, но насколько я понял они относятся к Proxy
  • clickmaker © (10.11.08 16:43) [1]
    авторизацию там своими средствами надо делать.
    пишешь метод LogonUser, заводишь сессию
    в методах, которые требуют авторизации, проверяешь, залогинен ли юзер
    А по умолчанию там используется дефолтная http-авторизация, так же как, DCOM, к примеру, использует доменных юзеров
  • Сергей М. © (10.11.08 16:46) [2]
    IMyAppServerSOAP = interface(IAppServerSOAP)
    ..
      function Logon(User, Password, Role: MyType): MyLogonResult;
    ..
    end;
  • DSKalugin (10.11.08 16:59) [3]
    >http-авторизация
    в качестве HTTP-сервера использую встроенный "индийский" (Indy) TIdHTTPWebBrokerBridge так что особо им не поуправляешь.

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

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

  • DSKalugin © (10.11.08 17:06) [4]
    >Сергей М.
    а какое отношение "function Logon" имеет к доступности всем ветрам серверного DataSetProvider-а?
  • Сергей М. © (10.11.08 17:20) [5]

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


    Такое что доступность или недоступность волен определять ты сам в динамике (а не в статике, как это у тебя реализовано сейчас) после успешного или неуспешного прохождения авторизации в ходе вызова клиентом метода Logon интерфейса твоего апп-сервера
  • DSKalugin © (10.11.08 17:33) [6]
    цитата для Сергея из http://www.delphiplus.org/articles/delphi/soap_it_is_easy/

    Основное условие при программировании SOAP: сервер должен быть stateless, т.е. результат выполнения запроса не должен зависеть от предыдущих команд, полученных сервером.
    *********
    нельзя одной командой передать параметры, а другой считать результат - все должно происходить в рамках одной команды
  • clickmaker © (10.11.08 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 © (10.11.08 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-у чтобы он не обрабатывал "чужие запросы"

    как видите ни методы ни тем более параметры этих методов тут не используются
  • Сергей М. © (10.11.08 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 © (10.11.08 22:08) [10]
    это все клиентский код, а что нужно сделать на сервере, чтобы
    здесь
    soapDM.cdsReader.Execute; // <- здесь


    заполучить исключение?
    ведь между
    IMyAppServerSOAP (SoapConnection.AppServer).Logon(..)


    и
    soapDM.cdsReader.Execute;


    нет никакой связи т к Logon будет выполнен в одном серверном процессе, а отработка запроса - в другом, потому что SOAP работает как stateless
  • Сергей М. © (11.11.08 08:25) [11]
    Ты не понял. Или я неправильно объяснил.
    На стороне апп-сервера никаких исключений не будет.

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


    > soapDM.SoapConnection


    Что-то я не понял, что у тебя делает клиентский компонент SoapConnection в дейтамодуле на стороне апп-сервера ?
  • clickmaker © (11.11.08 11:05) [12]
    > Что-то я не понял, что у тебя делает клиентский компонент
    > SoapConnection в дейтамодуле на стороне апп-сервера ?

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

    Но я бы вообще отказался от прямого задания запроса через CommandText на стороне клиента. А делал бы все через методы, передавая имя провайдера
  • DSKalugin © (11.11.08 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;


    тобишь одним действием и авторизация и получение данных
  • Сергей М. © (11.11.08 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 © (11.11.08 11:54) [15]
    > [14] Сергей М. ©   (11.11.08 11:40)

    да у него там может и обычный DataModule быть. Просто как контейнер для датасетов
  • Сергей М. © (11.11.08 12:03) [16]

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


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


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


    Кривовато, но суть одна и та же, что и при использовании специально реализованного метода аутентификации.
  • DSKalugin © (26.11.08 17:29) [17]
    TsoapDM. (клиентский ДМ, работающий с соап-ом)<> TsoapRDM. (серверный)

    да уж действительно названия датамодулей подобрал почти одинаково (неудачно)
  • имя (30.11.08 13:14) [18]
    Удалено модератором
  • ага (30.11.08 15:48) [19]
    Удалено модератором
  • Ega23 © (30.11.08 15:53) [20]

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


    В рунете есть масса других форумов. С другой системой модерации. Бывают даже и без оной.
  • ага (30.11.08 16:18) [21]
    To Ega23 ©

    Да, я в курсе, спасибо. Да Вы не беспокойтесь, я воду здесь мутить не собираюсь, и без меня мутно. Это было что-то типа прощального привета.
  • sniknik © (30.11.08 16:23) [22]
    > Это было что-то типа прощального привета.
    будем по тебе скучать... как и по любому "сделавшему ручкой" троллю. по таким лучше скучать чем общаться.
  • имя (20.04.09 23:18) [23]
    Удалено модератором
 
Конференция "Базы" » Авторизация в DataSnap/SOAP [D7, FB 155]
Есть новые Нет новых   [134477   +39][b:0][p:0.002]