2. 呼叫 对连接其间每次呼叫进行安全检查
8 A" E, ^/ n; G/ O: k$ Z6 p: R" Y1 _5 B; i5 ]3 b! b& d$ p) n
对应于MIDAS中其实就是每次取、改数据时对用户进行检查
因为所有客户端都是通过IAppServer接口对服务器进行操作
因此一劳永逸的方法是自己提供IAppServer接口的实现,
; O" C8 ^5 d5 n- a" A. ]考察一个实例
$ J$ z& a% w* `% O
class ATL_NO_VTABLE TLoginServerImpl
: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin
1 k3 [/ g! P$ Q- A; mServer),
public IConnectionPointContainerImpl<TLoginServerImpl>,
1 I0 o% _. Z$ o' h! }1 V8 b8 F3 Ypublic TEvents_LoginServer<TLoginServerImpl>
" n* R5 Y# V- L/ A2 ~$ \5 ]{
% n; o7 M5 r8 F( R...
}
BCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义
3 @$ |# r& i3 _ [5 Y8 U [
#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \
+ T# I2 K' b+ L8 f F, Jpublic CComObjectRootEx<CComObjectThreadModel>, \
^5 f* v/ x% t# Kpublic CComCoClass<cppClass, &CLSID_##CoClass>, \
- u" c5 r8 J( ?. z6 M" upublic IAppServerImpl<VclClass, cppClass, intf, &IID_##intf, \
LIBID_OF_##CoClass>
) @+ b1 U& r7 `2 ?# G+ u) h1 O/ C$ G
这里的IAppServerImpl是BCB用来实现IAppServer的模板类
3 c" i6 U m/ T/ n2 c& N而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁
完全可以通过实现自己的相应模板类来实现在IAppServer
1 w3 }) L- O N" o$ J3 A9 P4 `一级实现用户身份检验功能。这样做效率最高,但比较麻烦
# } ^& W& t* _2 G# e- c5 q有兴趣的朋友可以自己下去试试,这里不再详细说明
0 Y5 {, W" U" _
注意基本上所有的IAppServer方法都提供了一个OleVariant& OwnerData
5 K4 t" g( F; ^# g参数,可以通过此参数取得足够的用户信息,用以校验
; Q7 d$ x9 Y% n' V比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型)
2 i/ I& x, B; R& ]7 y/ R/ a# o7 N. H 然后将之与服务器端已知的特定用户信息一起hash一把,呵呵
次一级的方法是利用现有的VCL结构提供的事件来解决
O+ V* R' z7 [* s+ H2 A不过这样做就有点麻烦了,呵呵,你必须在所有需要有
# D$ A7 g. g: h8 R安全检验功能的TDatasetProvider的基本上所有BeforeXXX
' I% y2 q- L/ f' r事件里面增加相应的安全检验功能,如
, c8 R! l) J: ~& ?if(!IsLogin(OwnerData))
) I" m6 l' r3 t; M. t{
1 ]/ o! y% L8 Fthrow Exception("Please login first!");
}
1 \0 C8 w& A5 c# l Z5 C* c; P2 e- F出错直接抛出一个异常即可,系统会自动捕获返回给客户端
+ T8 J2 Q# \. m- p好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码
% }, y7 X3 o: {1 c* S- M而在客户端需要做的事情就是在合适的时刻login/logout
然后在相应的TClientDataSet::BeforeXXX事件中将
OleVariant &OwnerData设置成相应的数据
, p! k% H# M/ R/ R
一种变通的办法可以重载你的TSocketConnection类
$ F/ r- b4 K* ~( o& S将每次对IAppServer接口的调用中的OwnerData加一个
自己的鉴定信息头,然后在服务器端剥离,呵呵
这个方法有兴趣自己试试好了
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |