一个三层midas(RDM)的调查,多人共同开发. 1.服务器的接口如何维护,如果项目比较大,又不想拆分为多个应服务器,这样服务器的RDM可能就会要定义很多接口供客户端调用,这样问题就出来,不同的开发人员的不同模块会需要不同的接口,这样最后如何合在一起。 2.如何注意安全性?
   我们知道,RDM的安全性很差,其他人可能很容易恶意攻击你的系统,因为你可能会定义很多接口函数和输出很多TProvider。    希望大家畅所欲言,谈谈你的看法!

解决方案 »

  1.   

    全部做成DLL嘿 偶也8会 :(
    安全专门做个安全服务器用来验证身份的 内似内部网的那种 客户需要装客户端 可以吗
      

  2.   

    1:可以引出几套接口,按不同的模块划分给不同的开发人员..就比如说你有A,B,C三个接口函数,A和C实现的一定功能,B是存取数据.就可把把AB划分为一个接口,BC又划分为一个接口这样就在逻辑上划分开了,而操作的也是同一个数据库.
    2:没做过,没经验~听课!
      

  3.   

    下面仅仅是我的想法而已
    问题一:
      1、尽量减少接口数量,把普通接口尽量做成通用性较好通用接口
      2、多人公用主unit,各自建立自己的unit,主unit只放声明和调用接口,自己的unit里实现接口的功能,这样也许可以减少冲突的机会。
      
    问题二:
      可以在每个接口处加一个用于校验的参数,符合条件的才通过。不知这样处理是否可行?多多交流!
      

  4.   

    1.服务器的接口如何维护,如果项目比较大,又不想拆分为多个应服务器,这样服务器的RDM可能就会要定义很多接口供客户端调用,这样问题就出来,不同的开发人员的不同模块会需要不同的接口,这样最后如何合在一起。
    ***建议由开发小组中的某一个人来统一管理所有的接口定义,并要求各模块的人
       提交接口,然后接口管理者对申请的接口进行分类整合再定义接口,
       然后分发所发接口定义和参数含义;
      

  5.   

    To lzf1010(luke) 各管各的unit或数据模块是对的,但接口的声明我觉得这样还是不好,如要修改的话还得到主负责哪里修改,增加删除也一样。
      

  6.   

    2.如何注意安全性?
    这个我倒是没有克意去解决,因为我的客户里面没有去攻击的,没有在意,
    以前用过两种方式吧,一种就是用DELPHI内置的COM方式去联接,我不管了。
    另外一种用SOCKET与接口函数的调用的方式组合起来调用,
    不过太麻烦了,而自己做也很难把数据分块来传送,只能把所有数据全部传下来,
    这样又影响效率了。
      

  7.   

    当然也要考滤在internet时用SocketConnection连接的情况
      

  8.   

    你看这样行不行
    主unit只放两个:一个是函数,一个是过程,都只有一个类型为olevariant的参数客户端用一个函数来组合出这个参数,服务器端主unit解析该参数,分析出该调用那个分unit里的函数,每个f分unit也有一个自己的函数负责调用自己unit里的函数,这样调用的过程就比较清晰了
    客户端:socketconnection1.appserver.execproc(olevariant);//olevariant为一个参数数组服务器端:
    procedure execproc(olevariant);
    var
      UnitTag:integer;
    begin
      unittag:=从数组里的一个里取出
      case unittag of
        0:execprocex(olevariant);//分unit负责调用各自unit里的函数的分函数,也是负责解析的
        .
        .
        .
      end;
    end;procedure exexprocex(olevariant);
    var
      tag:integer;
    begin
      tag:=从数组的第二个里取出
      case tag of
        0:具体的函数;
        .
        .
        .
      end;  
    end;你看这样处理行不?就是客户端组合成olevariant的实现比较复杂呵呵,也是一个想法,不知是否可行?
      

  9.   

    我觉得可以根据业务不同配备多个 RemoteDataModule,设置各自的接口方法
    对每个 RemoteDataModule 中的数据库连接组件如 ADOConnection,都要在合法的客户端登录后才进行 ConnectionString 的配置。
    这样,即使恶意的客户端连上了  RemoteDataModule,仍然不能取得数据库的数据。
      

  10.   

    1、我个人认为中间层提供过多的接口给客户端,是不妥当的。2、对于安全性有很多的解决办法,首先是需要有以下认识:
        IAppServer 接口中的 ProviderName 参数只是一个 WideString,没必要非要认为它是 DataSetProvider 的 Name 值。 正因为 ProviderName 参数只是一个 WideString,所以可以通过它传递很多信息——用户登陆获得的 Cookie、DataSetProvider 的 Name 值、复杂的查询条件等等。
      

  11.   

    另外,还可以完全不使用 IAppServer 接口,不使用 Delphi 提供的 RDM。因为 midas 本质是一个数据打包解包的技术,它完全可以不依赖 IAppServer 和 RDM。
      

  12.   

    流铭兄是高人了!
    理论上说可以不依赖 IAppServer 和 RDM,但对于当前的应用需要快速开发,如果全部自己来做,恐怕也是不太合适吧?见笑了^_^
      

  13.   

    花兄可别这么说,小弟惭愧啊!要使自己的程序不使用 IAppServer 接口和 RDM,只需对 MIDAS 的相关源码作少量的改动即可,远没有想象中的复杂!使用 IAppServer 和 RDM 也行,只不过最好还是 override RDM 中的相关函数,做一些必要的改动,这样就完全不会出现安全性问题。
      

  14.   

    呵呵,就在我看这个贴子之前,我看到一篇文章
    非常不错,我觉的值 的大家一看:
    http://developer.ccidnet.com/pub/article/c1079_a34765_p1.html
    Delphi中编制分布式多层应用系统服务资源浏览器  
    作者:陈立平 发文时间:2002.12.25 09:28:38 
     
    本文详细介绍了在Delphi7中如何利用TSocketConnection控件设计开发一个通用的分布式多层应用系统客户端辅助开发工具——分布式多层应用系统服务资源浏览器。 在用Delphi开发分布式多层应用系统过程中,对于开发客户端程序的人员来说,了解分布式多层架构应用服务器所提供的资源(如:服务名称、提供者名称等)是一项经常遇到的工作。利用这些参数,客户端才能够正确地与服务器端程序连接并工作。 然而,在实际工作过程中,这些资源名称大都是以口头或E-Mail的方式,告知客户端开发人员;而一旦这些资源名称被改或者此类名称在一个开发服务器上较多时,就会发生程序不能与服务器正确连接的情况,或者造成服务名资源管理上的混乱。 另外,客户端开发人员只有在开发出客户端程序之后,才能够与服务器端程序进行连接并进行测试,没有前期通用的辅助工具与服务器进行交互,无形中增加了通信的开销,降低了开发工作的效率。 那么,有没有好的实现方法能够做到自动列出指定服务器上的开发资源名称,并能够与之进行动态地连接和交互呢?这就是笔者开发多层应用系统服务资源浏览器的原始初衷。 
     
      

  15.   

    huojiehai (海天子) ,最近赶活,很久没发言了。有空再看看,做个记号。
      

  16.   

    学习....
    不知道用多个RDM会不会好点?
      

  17.   

    既然是大型项目,又何必强求只用一个应用服务器呢。
    还有,如果强调安全性,那就不要用控件。
    我还是比较喜欢用VC的ATL模板开发COM+的方式。
      

  18.   

    我很少用3层的,大部分2层就够用了
    接口维护使用有意义的标识,做好文档,共同协商好,这样问题不大
    添加自己的Socket Intercepter,并使用OpenSSL技术来解决安全问题
    但这样对客户软件有所要求
      

  19.   

    没有作过Delphi MIDAS方面的确应用, 但是非常关注这个话题。先Mark。
      

  20.   

    j2ee中是用session bean来写接口, 然后在注册到app server中的JNDI中. 客户端利用naming lookup来找到该接口. 这样一来不同的模快用不同的session bean.
    com+和.net也是这个方法, 不过是利用mts和ASDI.
    在midas中, 不同的模快应用不同的RDM. 再把这些RDM集合到一个app server中.
      

  21.   

    说说安全性吧,如果项目比较大的话,可以从几个方面来考虑,主要是数据的传输加密和安全认证。一般来说,TDataSetProvider的安全性很差,如果不自己改造的话很容易就被人攻击了。所以需要一个认证机制。其中最好使用加密过的数据头来进行安全认证。也就是说要自己去改造接口。
      

  22.   

    建议把数据库操作和业务逻辑分开,
    如:把算产品成本的一个COM(或者是一个类),
    数据库操作也做成一个,
    合法性验证也做成一个。安全的话我用的是TDCOMConnection(因为是局域网,客户还有放火墙,
    所以没考虑太多)。说错了的话,不要笑呵,^_^
      

  23.   

    1、多层应用可以做成客户端+业务服务层+数据库服务层+数据库层,其中数据库服务层可以做成一个COM,她完成所有对数据库的技术操作,包括数据库的连接方式、连接配置、数据缓冲机制、分包传输。所有这些内容都不使用Midas提供的功能。业务服务层既可以放在服务器端,也可以放在客户端,如果放在服务器端那么需要做的附加工作可能就比较多,例如并发机制等;我是放在了客户端。
    2、安全性问题,使用DCOM本身的安全性。另外还可以附加一种机制,每次客户端登录到服务器使用一次用户名、口令的验证,之后本次验证生成一个GUID给客户端,下次客户端使用该GUID进行验证即可。
      

  24.   

    huojiehai(海天子)
    我说的那个想法,你怎么不给点建议呢?
      

  25.   

    看到短信 这可是一个 不小的难题阿分开 开发要是各自 维护个人的 那以后维护保证很麻烦 这里有个难题就是多个RemoteDataModule 给不同客户端 提供太多接口给不同客户端 这样在同时处理一个数据库特别业务规则很麻烦时 可能会引起错误,可是不这样做提供通用用接口好像达不到你的要求。
    提一个 我做过得建议 中庸一点 尽量减少接口数量把一些做成同用 这样在RemoteDataModule
    不同客户端就提供尽量清晰的 接口规范 专门让一个人 维护这些如何注意安全性这一点我同意流铭兄的观点:)
      

  26.   

    To  lzf1010(luke)
      谢谢你的关注,同时也谢谢大家的关注,我在前面做过简单的回答了,我到最后会对这个贴子作个总结,同时也会提出自己的观点!希望大家各抒己见,没谁对也没谁错,有任何想法都可以说出来,大家共同探讨!  兄弟姐妹们请继续!
      兄弟姐妹们请继续!
      兄弟姐妹们请继续!
      

  27.   

    To  lzf1010(luke)
      谢谢你的关注,同时也谢谢大家的关注,我在前面做过简单的回答了,我到最后会对这个贴子作个总结,同时也会提出自己的观点!希望大家各抒己见,没谁对也没谁错,有任何想法都可以说出来,大家共同探讨!  兄弟姐妹们请继续!
      兄弟姐妹们请继续!
      兄弟姐妹们请继续!
      

  28.   

    团队开发需要良好的版本控制,不多说了。关于安全性问题,不要仅仅想着从某一个方面着手,更多的要从操作系统上去想办法。例如使用Windows用户身份集成验证、IP访问限制策略等等。多数攻击者在这一层防范前就被阻挡了。在应用服务器这一层上,需要一个本系统范围用户身份验证的机制,例如Session管理器等手段,在每一个需要限制的调用中都通过它检测请求的合法性。楼主不要掉在具体技术里出不来了
    --------------
    welcome to my homepage: www.ezService.org
      

  29.   

    1.服务器的接口如何维护,如果项目比较大,又不想拆分为多个应服务器,这样服务器的RDM可能就会要定义很多接口供客户端调用,这样问题就出来,不同的开发人员的不同模块会需要不同的接口,这样最后如何合在一起。:解决问题的方法有很多种,比如这个也一样,可以有两个RDM,分开处理不同的规则,而不同成员可以针对不同的规则选择RDM,这样范围缩小了。(一个大项目中,多个RDM是很正常的事)。再者,接口以支持继承,接口的定义肯定有项目经理/框架设计师来定的,一个项目中存在不同的接口是很正常的,但是,如果每个成员的可以自己实现接口的话,那么,项目应该失败的多。其实,这个问题的讨论点在第2点,因为第一个问题不是技术上的事,当然解决方案可以有:
        1):接口的集成度尽量高些,支持继承性的接口定义(就是定义地时候尽量的留出扩展)
        2):开发人员进行分离,业务层 + 表示层 //最好不进行跨界开发
        3):接口少 + 精,开发模式   设计 -〉 模型 -〉 在设计 -〉 模型 2.如何注意安全性?
       我们知道,RDM的安全性很差,其他人可能很容易恶意攻击你的系统,因为你可能会定义很多接口函数和输出很多TProvider。
      安全性可能是一个不变的话题,软件做不到的事情,硬件可以做到。
      DCOM已经提供了很好的安全处理机制,其实,在这儿,可以部队用户登陆信息进行什么安全性的验证,如果以RDM的登陆以安全性验证的话,你可以预留一个接口,进行用户身份认证,具体的做法相当多,其中,用户可能需要一个证书来反馈登陆信息反馈给用户的信息,这样可以在证书上做文章。这是一种,还有就是对接口之间调用的约定,等等,感觉方法太多了。
    然而,安全商业只不过放君子罢了!
    还有,你说的安全机制 是否要印出来事务机制?
      

  30.   

    占个位先ihihonline(疯子):你怎么成疯子了,你不是还说我是疯子吗?
      

  31.   

    ihihonline(疯子)
    2):开发人员进行分离,业务层 + 表示层 //最好不进行跨界开发
    这里开发人员进行分离,如果业务层没有开发完成的话,表示层的开发人员如何进行调试呢?
    呵呵,没有这方面的经验,请指点一下,谢谢!
      

  32.   

    lzf1010(luke) :可否能知道您是哪儿的程序员?如果业务层没有开发完成的话,表示层的开发人员如何进行调试呢?//业务层的开发完才开发表示层吗?那不是又回到了 N久以前的“瀑布型”的看法模式了吗?
    没有这方面的经验,请指点一下//设计 -〉 模型 -〉 在设计 -〉 模型
      

  33.   

    请各位看这个图,请不吝赐教http://61.28.22.20/myweb/yj/Com_Struct.jpg(费了十几分钟才拼起来)
      

  34.   

    在我做的项目中使用delphi7.0 + midas 接口问题这样解决的。
    服务器和客户端都使用一个接口方法,然后通过命名管道的方式来调用。传入和传出的参数都通过Olevariant达包来传递。这样就就简化了接口的调用,
    //Servicecode需要处理该调用的服务对象代码
    //FuntionName 函数名,
    //InParam 输入参数
    //OutParam输出参数
    。函数定义如下
    function CallServiceFuncion(ServiceCode : string ;AFunctionName :string ;InParam :Olevariant ;out OutParam:Olevarint):integer;这里需要注意的是。应用服务器中对每个功能实体都定义了一个datamodule作为服务对象,它实现具体的功能。远程数据模块只是做一个分发中心,接受客户端请求,根据servicecode创建服务对象,转发请求给该服务对象。服务对象接收到命令请求后再根据具体的FunctionName再去实现具体的功能,返回值。通过这样的设计,客户端和服务器端的调用简单,对象颗粒化,职责清晰,缺点是:函数调用无法做到编译期检查,性能也不是很好你可以考虑这样的设计。
      

  35.   

    1)不一定要一个RDM,可以有多个RDM的。
    2)我想先认真,然后返回一串古怪的数字(当然每个用户认证的数字都不能一样),然后函数都要有这串数字,数字不对是不能调用函数的功能的。另外,值得注意的是效率问题,最好使用pool,另外MIDAS使用DCOM对服务器的性能要求比较高。
      

  36.   

    收到短信,一起学习.那要看你需要封装到什么程序度了, 如果你想在客户端写SQL语句的话也并不一定要有很多的TDataSetProvider的,我写过一个程序,服务端只用了一个TDataSetProvider,做法跟两层没区别,呵呵,当然只是为了糊弄一下客户的,不算真正的分布式开发.
      

  37.   

    不懂,没有做过这个。感觉上。用多个RDM很有来区分你的业务没有什么不好。本身就是若干个子系统,一个子通有自己接口也不过分。整个系统够架上能够处理就可以了。对于开发人员的管理或者任务分配的顾虑上,我觉得可能是你们投入开发的人员太少了。安全性反面,的确是个永远存在的问题,把精力放在怎么把狼拒之门外还不如想想,狼来了怎么保护自己的小绵羊好。
    楼上各位说的都很有道理,让我受益非浅,毕竟欧没有参与过3层开发,见笑了。
      

  38.   

    用多个RDM,这样对系统功能上的封装有好处,而且你的项目如果很大,也对你以后代码的维护有很大帮助。对于安全性上面的问题就没搞过了,个人觉得算法不能太复杂,不然对于系统的性能和效率有影响。