1 H0 K8 R J6 ?! _; f9 D
2. 呼叫 对连接其间每次呼叫进行安全检查
对应于MIDAS中其实就是每次取、改数据时对用户进行检查
' U1 `/ _. L7 G6 U0 W2 D! P' B% U8 ^因为所有客户端都是通过IAppServer接口对服务器进行操作
" Z3 ^" e- l8 c$ v. X. ?, J% q因此一劳永逸的方法是自己提供IAppServer接口的实现,
" v8 ]; Z. P/ O n1 E考察一个实例
class ATL_NO_VTABLE TLoginServerImpl
9 M( U( ^- U& f% i' q$ B/ c- R: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin
Server),
public IConnectionPointContainerImpl<TLoginServerImpl>,
public TEvents_LoginServer<TLoginServerImpl>
4 H m1 x- G- Z1 C& {( @7 C{
3 }8 l& c5 U4 F( j% ]+ G4 I+ D...
}
& `% d' |/ M- g p+ ~: zBCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义
#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \
public CComObjectRootEx<CComObjectThreadModel>, \
* v' Q/ o, [8 Y2 i- cpublic CComCoClass<cppClass, &CLSID_##CoClass>, \
public IAppServerImpl<VclClass, cppClass, intf, &IID_##intf, \
9 Z: h2 h0 e4 D" C2 NLIBID_OF_##CoClass>
7 B3 {, C8 Z7 h1 _, u) v; r* D
这里的IAppServerImpl是BCB用来实现IAppServer的模板类
4 `" D8 }. ~; a; S3 [ E3 s' d而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁
* V! e: q; T& m, E完全可以通过实现自己的相应模板类来实现在IAppServer
* ^. K; J$ p" m a7 s$ @) |一级实现用户身份检验功能。这样做效率最高,但比较麻烦
$ O8 P7 O, x' ^3 J有兴趣的朋友可以自己下去试试,这里不再详细说明
4 l2 c C4 V% Z1 t0 F( H! O+ h& ~; t7 R0 Y& K9 c' }* h
注意基本上所有的IAppServer方法都提供了一个OleVariant& OwnerData
参数,可以通过此参数取得足够的用户信息,用以校验
比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型)
+ D7 k7 D1 v0 ?! u, \4 Y( ] 然后将之与服务器端已知的特定用户信息一起hash一把,呵呵
次一级的方法是利用现有的VCL结构提供的事件来解决
/ t8 T' J+ r0 u9 \" ?不过这样做就有点麻烦了,呵呵,你必须在所有需要有
. a3 q; f5 K+ q$ u安全检验功能的TDatasetProvider的基本上所有BeforeXXX
0 ? _5 E4 R! B" k, R事件里面增加相应的安全检验功能,如
if(!IsLogin(OwnerData))
, n4 U7 X- S4 p& M{
' b2 J. l/ H/ ethrow Exception("Please login first!");
5 L/ _/ l- G' D/ U" d) F}
出错直接抛出一个异常即可,系统会自动捕获返回给客户端
3 d- _: J0 p$ i/ ?% k9 I0 a+ c好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码
而在客户端需要做的事情就是在合适的时刻login/logout
- D$ e7 O: S" M然后在相应的TClientDataSet::BeforeXXX事件中将
OleVariant &OwnerData设置成相应的数据
- n0 F# s1 j* o
一种变通的办法可以重载你的TSocketConnection类
+ H B/ x @( N( {( |将每次对IAppServer接口的调用中的OwnerData加一个
自己的鉴定信息头,然后在服务器端剥离,呵呵
这个方法有兴趣自己试试好了
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |