QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

6 F: v C% v) ]. a0 Q9 \: o

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

; V* S* R$ q; x9 l

4 f) m2 c* k6 P- x! S8 M) p& y+ B

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

7 U& x/ @5 F1 p1 `4 L! p |

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

! E1 j8 i7 d9 ^8 q- V

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

' u5 x f( `" T8 i+ u- v

考察一个实例

3 I' ]/ T& [5 [5 g/ J. O/ j1 e0 \8 Z

8 v% W3 {( `6 K; R

class ATL_NO_VTABLE TLoginServerImpl

3 C, x2 m k1 q

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

% B p+ ~; I. @3 b

Server),

" `/ X$ V! g( L$ y. d7 K8 x n2 w

public IConnectionPointContainerImpl<TLoginServerImpl>,

: b+ M, E/ a0 }( m

public TEvents_LoginServer<TLoginServerImpl>

! G6 P2 m0 \( T" j, ~

{

0 w2 e+ a1 y0 {+ M7 n: C$ H# X

...

; _- `8 P) i* R' J- y

}

) W4 a( k4 |1 _. X1 w

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

- I; t1 ~6 I0 P; q' r C

7 k8 Y; U$ ~9 l; A2 B, S4 I! a

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

6 u8 d. w$ p$ G) y5 G

public CComObjectRootEx<CComObjectThreadModel>, \

7 K* f4 \! k) Y6 H9 I

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

- T% Q2 w& E" S* W; Z( a" }6 V

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

, @: M1 W. f6 _! V

LIBID_OF_##CoClass>

# C: h, M I2 \5 L+ y

% L$ ?. L) k8 Z9 c! x1 [9 C

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

. T3 m" C; e2 [1 q7 \5 r

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

6 ]; T! n3 _0 O

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

1 Q1 y& w+ F F1 P3 t8 }) ]

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

: e: t: ~0 f2 E# p8 _8 v+ w8 f

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

5 `8 ]: S6 t2 Y! f

( q, W7 H$ Y. u) n Y! K

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

! {! O( w& {. ^$ S

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

% n8 D: e D! j) S6 y1 m2 ~

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

7 e: z" ]5 A& K

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

0 [# p8 X; |7 ~6 G! x2 c/ j9 |

7 W# R& \' s( Y$ {/ z

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

: q% n: K* w# S1 \ D' X

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

/ S4 r& Y, \8 t3 ~

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

) K3 X5 ?8 {& v; j

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

" [ Q* x+ W( L$ Z

if(!IsLogin(OwnerData))

; O1 [2 l" v. o4 L. f! i

{

" m0 q8 ]4 F/ w3 o, q

throw Exception("Please login first!");

. R4 o! w; u8 O

}

; h. x, D3 l& g

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

; \4 u' O1 F3 P) H

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

E3 }2 h9 h8 F, n8 P! M' U

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

9 R- k) z' ]# }% Z& S. J# v* j

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

& P: \ J& ~8 P/ W

OleVariant &OwnerData设置成相应的数据

4 n( ]( E9 P- X

" i. D6 {3 u2 B/ {! G6 V

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

0 A# V# F3 t7 v/ K& ]8 q d2 r

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

2 `( [" V" v G; Q

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

2 H# G% K6 f3 o4 t; F6 v5 |* X

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

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-20 08:12 , Processed in 0.432896 second(s), 52 queries .

回顶部