韩冰 发表于 2005-1-26 01:09

socket连接多层程序安全性简述 - 呼叫

<P>  </P>
<P>2. 呼叫  对连接其间每次呼叫进行安全检查 </P>
<P>  </P>
<P>   对应于MIDAS中其实就是每次取、改数据时对用户进行检查 </P>
<P>   因为所有客户端都是通过IAppServer接口对服务器进行操作 </P>
<P>   因此一劳永逸的方法是自己提供IAppServer接口的实现, </P>
<P>   考察一个实例 </P>
<P>  </P>
<P>class ATL_NO_VTABLE TLoginServerImpl </P>
<P> : REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin </P>
<P>Server), </P>
<P> public IConnectionPointContainerImpl&lt;TLoginServerImpl&gt;, </P>
<P> public TEvents_LoginServer&lt;TLoginServerImpl&gt; </P>
<P>{ </P>
<P>... </P>
<P>} </P>
<P>   BCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义 </P>
<P>  </P>
<P>#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \ </P>
<P>  public CComObjectRootEx&lt;CComObjectThreadModel&gt;,                \ </P>
<P>  public CComCoClass&lt;cppClass, &amp;CLSID_##CoClass&gt;,                \ </P>
<P>  public IAppServerImpl&lt;VclClass, cppClass, intf, &amp;IID_##intf, \ </P>
<P>                        LIBID_OF_##CoClass&gt; </P>
<P>  </P>
<P>  这里的IAppServerImpl是BCB用来实现IAppServer的模板类 </P>
<P>  而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁 </P>
<P>  完全可以通过实现自己的相应模板类来实现在IAppServer </P>
<P>  一级实现用户身份检验功能。这样做效率最高,但比较麻烦 </P>
<P>  有兴趣的朋友可以自己下去试试,这里不再详细说明 </P>
<P>  </P>
<P>  注意基本上所有的IAppServer方法都提供了一个OleVariant&amp; OwnerData </P>
<P>  参数,可以通过此参数取得足够的用户信息,用以校验 </P>
<P>  比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型) </P>
<P>  然后将之与服务器端已知的特定用户信息一起hash一把,呵呵 :) </P>
<P>  </P>
<P>  次一级的方法是利用现有的VCL结构提供的事件来解决 </P>
<P>  不过这样做就有点麻烦了,呵呵,你必须在所有需要有 </P>
<P>  安全检验功能的TDatasetProvider的基本上所有BeforeXXX </P>
<P>  事件里面增加相应的安全检验功能,如 </P>
<P>  if(!IsLogin(OwnerData)) </P>
<P>  { </P>
<P>    throw Exception("Please login first!"); </P>
<P>  } </P>
<P>  出错直接抛出一个异常即可,系统会自动捕获返回给客户端 </P>
<P>  好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码 </P>
<P>  而在客户端需要做的事情就是在合适的时刻login/logout </P>
<P>  然后在相应的TClientDataSet::BeforeXXX事件中将 </P>
<P>  OleVariant &amp;OwnerData设置成相应的数据 :) </P>
<P>  </P>
<P>  一种变通的办法可以重载你的TSocketConnection类 </P>
<P>  将每次对IAppServer接口的调用中的OwnerData加一个 </P>
<P>  自己的鉴定信息头,然后在服务器端剥离,呵呵 </P>
<P>  这个方法有兴趣自己试试好了:) </P>
页: [1]
查看完整版本: socket连接多层程序安全性简述 - 呼叫