2. 呼叫 对连接其间每次呼叫进行安全检查
对应于MIDAS中其实就是每次取、改数据时对用户进行检查
K* z/ `. v+ _" D& H因为所有客户端都是通过IAppServer接口对服务器进行操作
因此一劳永逸的方法是自己提供IAppServer接口的实现,
: M- F4 ^9 I: d2 ~3 p/ Q8 r考察一个实例
, n0 c% a$ \# Q$ }( V: ^/ G% p/ \
class ATL_NO_VTABLE TLoginServerImpl
4 T+ [3 C1 Q2 v5 w7 L: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin
- e7 X m9 ] s0 VServer),
9 p! x5 a# ^2 i s, k- u% ipublic IConnectionPointContainerImpl<TLoginServerImpl>,
public TEvents_LoginServer<TLoginServerImpl>
{
. g6 F3 U% {7 t1 D$ b; m8 K...
+ q/ H6 u: A* E}
* U# L3 K; F+ cBCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义
#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \
* M b% b& D0 h5 w0 v: a! _public CComObjectRootEx<CComObjectThreadModel>, \
1 O. ]0 F* \1 F, \) a/ Spublic CComCoClass<cppClass, &CLSID_##CoClass>, \
$ T+ x0 ]; g, ~5 h# V& a: @5 ypublic IAppServerImpl<VclClass, cppClass, intf, &IID_##intf, \
LIBID_OF_##CoClass>
: {& |& ?" R4 \) _; O @0 z# ]9 p
这里的IAppServerImpl是BCB用来实现IAppServer的模板类
而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁
完全可以通过实现自己的相应模板类来实现在IAppServer
1 _! O' h0 U4 ^1 M0 j$ O- Z一级实现用户身份检验功能。这样做效率最高,但比较麻烦
有兴趣的朋友可以自己下去试试,这里不再详细说明
8 g! C7 W3 c4 Y9 {. L
注意基本上所有的IAppServer方法都提供了一个OleVariant& OwnerData
2 j2 q7 J9 H: \4 E3 ] F$ l% b参数,可以通过此参数取得足够的用户信息,用以校验
比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型)
3 ~- \: E: Q- q9 O2 J# i6 d 然后将之与服务器端已知的特定用户信息一起hash一把,呵呵
次一级的方法是利用现有的VCL结构提供的事件来解决
不过这样做就有点麻烦了,呵呵,你必须在所有需要有
安全检验功能的TDatasetProvider的基本上所有BeforeXXX
事件里面增加相应的安全检验功能,如
if(!IsLogin(OwnerData))
" j- V3 }9 Y( Z0 f: Y s{
throw Exception("Please login first!");
3 z2 s' {6 k$ ^, ^: A}
! M/ J# Y8 U. D9 u# O' N出错直接抛出一个异常即可,系统会自动捕获返回给客户端
2 x6 }3 O2 o/ s) [( v好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码
而在客户端需要做的事情就是在合适的时刻login/logout
然后在相应的TClientDataSet::BeforeXXX事件中将
OleVariant &OwnerData设置成相应的数据
一种变通的办法可以重载你的TSocketConnection类
! {- {. J8 J2 y/ u, E; K3 L将每次对IAppServer接口的调用中的OwnerData加一个
, o3 N" y& c3 a% f自己的鉴定信息头,然后在服务器端剥离,呵呵
0 d$ F3 G. y: K& R: g& l# Y 这个方法有兴趣自己试试好了
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |