QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2330|回复: 0
打印 上一主题 下一主题

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

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:09 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

( l9 T8 _7 D' f0 p, m, m

2. 呼叫 对连接其间每次呼叫进行安全检查

, \7 F, j; B2 P4 R, L4 |( o7 y! W3 O

4 l4 V. B" N# n. ~1 \- E

对应于MIDAS中其实就是每次取、改数据时对用户进行检查

+ t2 Z1 \ m) \

因为所有客户端都是通过IAppServer接口对服务器进行操作

? N9 ]! w7 ? k, ~$ X" L

因此一劳永逸的方法是自己提供IAppServer接口的实现,

( \8 T! X3 O, B4 j. ^+ v

考察一个实例

* C: v- N, V8 Z5 P5 m$ b

}6 {) _0 V9 @. C

class ATL_NO_VTABLE TLoginServerImpl

( ~. l: u2 \9 c" i" |

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

5 e- g2 u5 I( \8 Y& t

Server),

9 a5 V/ I9 V; U- z; q

public IConnectionPointContainerImpl<TLoginServerImpl>,

8 _6 D- V3 s* `$ I6 E( s% z

public TEvents_LoginServer<TLoginServerImpl>

5 w) p3 _. n! D5 y9 B c; i

{

$ N, y- U, k6 }7 A& [

...

( H* p7 k& y& L/ \* B+ s3 A

}

! c0 i4 U! ?& q e# a& a0 U+ ]* m' @

BCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义

h9 K3 ~# @% T( M) v, |

" n: b5 ~# }5 R! @1 G

#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \

+ r! a: L2 U7 d' u, Q

public CComObjectRootEx<CComObjectThreadModel>, \

# X5 l! h [5 U- ^7 J5 D+ F

public CComCoClass<cppClass, &CLSID_##CoClass>, \

1 ?$ A% X4 E3 u) t4 T7 t

public IAppServerImpl<VclClass, cppClass, intf, &IID_##intf, \

@( e5 \+ A; h

LIBID_OF_##CoClass>

9 Q" Q+ G8 r& V* g- A) y# [

) Y& q$ N) M9 t

这里的IAppServerImpl是BCB用来实现IAppServer的模板类

& s' C# F; H+ l0 G( N; q8 S

而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁

( u/ a e; ~' d1 p8 ~0 V l% `

完全可以通过实现自己的相应模板类来实现在IAppServer

" }7 G0 N+ u7 V) I, y0 f P

一级实现用户身份检验功能。这样做效率最高,但比较麻烦

0 i2 R' {) _% z

有兴趣的朋友可以自己下去试试,这里不再详细说明

6 ?8 E0 O# v; T0 C5 n' Y3 p b+ R

3 M$ k# `4 M7 q2 g5 q# l

注意基本上所有的IAppServer方法都提供了一个OleVariant& OwnerData

0 R. c0 G, Z" g+ T2 H

参数,可以通过此参数取得足够的用户信息,用以校验

/ y I( _0 e0 V+ Y- l7 Z" y

比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型)

% D2 T! H, c% m

然后将之与服务器端已知的特定用户信息一起hash一把,呵呵

* ?5 R' |$ U- ]+ v; G8 r

! q' N0 e3 }( }$ e- \* O

次一级的方法是利用现有的VCL结构提供的事件来解决

' T8 |1 }0 x) E: M5 q u

不过这样做就有点麻烦了,呵呵,你必须在所有需要有

0 U& C7 p3 {$ J+ F% y3 S9 U0 N

安全检验功能的TDatasetProvider的基本上所有BeforeXXX

9 L3 m' s" N* A$ w) G+ O( I

事件里面增加相应的安全检验功能,如

- s" d5 @6 ?& w# v

if(!IsLogin(OwnerData))

7 Z, W; D( P1 B/ K% i; b* X

{

( T6 `4 `7 s& |, {: j- p

throw Exception("Please login first!");

1 e" ?+ H/ ]. X- O. l$ C

}

, ?3 j/ A, q9 x% `! u+ P

出错直接抛出一个异常即可,系统会自动捕获返回给客户端

6 } A! b" a# q8 u- L% ?3 R

好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码

7 }" y% s5 D& H& B3 f

而在客户端需要做的事情就是在合适的时刻login/logout

6 | Q. p2 Y2 ^0 o4 [4 }: O; v/ t

然后在相应的TClientDataSet::BeforeXXX事件中将

: `% W+ @) K( q& G# }) V3 T) t4 y

OleVariant &OwnerData设置成相应的数据

" q- v0 `& B& O6 p' G8 n: }

' s, |: K5 c2 Z. H

一种变通的办法可以重载你的TSocketConnection类

7 R. F' W: D6 C: }4 C1 m2 Q

将每次对IAppServer接口的调用中的OwnerData加一个

& u j4 n7 _, b7 ]: P; e

自己的鉴定信息头,然后在服务器端剥离,呵呵

( c2 R% f( ^8 I+ d8 L& b: R7 _- U

这个方法有兴趣自己试试好了

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-18 09:10 , Processed in 0.422279 second(s), 52 queries .

回顶部