( ?) ` \: w" V1 n0 m! q
2. 呼叫 对连接其间每次呼叫进行安全检查
0 @- a; N& q8 D# w$ A0 E
对应于MIDAS中其实就是每次取、改数据时对用户进行检查
! N X' n& e$ `& u因为所有客户端都是通过IAppServer接口对服务器进行操作
因此一劳永逸的方法是自己提供IAppServer接口的实现,
考察一个实例
/ I/ N/ ]. L- D) e/ F4 V" p
class ATL_NO_VTABLE TLoginServerImpl
1 g5 q8 T2 V( D* o/ ~6 G/ M: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin
& k% p% W! p: Y$ i iServer),
public IConnectionPointContainerImpl<TLoginServerImpl>,
. h5 v- h2 O3 V9 l9 spublic TEvents_LoginServer<TLoginServerImpl>
{
...
9 H3 J" U3 }$ {+ o}
BCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义
8 x6 D j' F+ z0 I3 Y7 p: ~8 @
#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \
0 O2 z# B2 c( ?" C+ Fpublic CComObjectRootEx<CComObjectThreadModel>, \
public CComCoClass<cppClass, &CLSID_##CoClass>, \
; c+ e* P$ I5 [+ ]! D! I1 npublic IAppServerImpl<VclClass, cppClass, intf, &IID_##intf, \
4 y( h: w6 H8 h6 D [& r7 kLIBID_OF_##CoClass>
; o9 v# {0 y' k3 `: g4 `H9 t' j0 E$ e" S9 U3 p' p3 k; ?
这里的IAppServerImpl是BCB用来实现IAppServer的模板类
而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁
+ l/ N K8 s4 |# ?$ E7 l( ]! D完全可以通过实现自己的相应模板类来实现在IAppServer
一级实现用户身份检验功能。这样做效率最高,但比较麻烦
; t: [, c8 G% N, M9 x' ~6 o1 a有兴趣的朋友可以自己下去试试,这里不再详细说明
5 P* [, J% Q+ ]2 Z
注意基本上所有的IAppServer方法都提供了一个OleVariant& OwnerData
+ L4 T7 N T, B3 E1 q9 E# o6 c0 |参数,可以通过此参数取得足够的用户信息,用以校验
! o" x1 X$ N/ ?1 m比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型)
( O3 \) ^; `9 {! { 然后将之与服务器端已知的特定用户信息一起hash一把,呵呵
( m3 L" v: G) ]- |' `
次一级的方法是利用现有的VCL结构提供的事件来解决
不过这样做就有点麻烦了,呵呵,你必须在所有需要有
安全检验功能的TDatasetProvider的基本上所有BeforeXXX
. T9 g. i+ g- P事件里面增加相应的安全检验功能,如
' X1 E% Y0 x8 \0 N0 `if(!IsLogin(OwnerData))
{
% y- J4 j' _5 W. G1 ?throw Exception("Please login first!");
" }8 l8 D! a' q5 K6 o9 A% e0 N O}
出错直接抛出一个异常即可,系统会自动捕获返回给客户端
好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码
而在客户端需要做的事情就是在合适的时刻login/logout
8 O$ p" V. o/ h2 V9 l+ W0 l然后在相应的TClientDataSet::BeforeXXX事件中将
1 v6 k' ~% i7 E( X, r OleVariant &OwnerData设置成相应的数据
* I( j& R6 f# ]2 H
一种变通的办法可以重载你的TSocketConnection类
将每次对IAppServer接口的调用中的OwnerData加一个
自己的鉴定信息头,然后在服务器端剥离,呵呵
0 V+ I6 Q; M" ?4 s! a( R 这个方法有兴趣自己试试好了
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |