QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

! a1 W% {+ j% j

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

' @- ]0 ~- I! n$ C U& f, R

6 E8 f- |3 e6 m6 Q9 D2 E

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

! d( i$ U0 u& H6 r

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

- ]. ~4 H, D& j) J$ [

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

( H. B* q; U+ v8 t

考察一个实例

. k" t( P, Z) }; W D! D

1 p3 I9 j* w/ a( i* Z

class ATL_NO_VTABLE TLoginServerImpl

! u4 n# {3 `2 l/ b

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

' c. ]2 R% a: ]0 k

Server),

8 d( D u& {- r+ P

public IConnectionPointContainerImpl<TLoginServerImpl>,

- [3 x& ?: w# H4 Z0 P

public TEvents_LoginServer<TLoginServerImpl>

! F, q5 c4 e- I) _

{

2 Q+ [1 m( I- T" a9 T9 n

...

' v& S* J; Q2 }% u4 K

}

( z f7 {' \+ v* i. ]. s/ d. r

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

3 U+ d" X9 Y; w& s, N$ u

5 E0 R+ [& p- d: O: L

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

W6 Q3 @5 L, ~; G

public CComObjectRootEx<CComObjectThreadModel>, \

. I U. ?; }# ]. u S

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

6 J6 ?% r& V4 z# F

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

- M. h2 }8 H: c& G& ]3 a

LIBID_OF_##CoClass>

. W2 m; v9 e7 w

( j8 _' D( |- }! T/ _: p! Q! B) p

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

3 v4 W' f! A& X7 f4 {7 i$ I" t

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

0 t9 d; x' ~7 C. Z& T" u

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

: b* }- H) f6 `8 L

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

, r! A2 c, h" g) X

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

# m2 U; W6 [- t% f" [6 d

$ a6 l0 K) N- P0 Z9 J1 I5 m

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

) O8 P+ c- ]* x/ m' `# V0 i

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

% e9 l8 P1 `5 Z' I% {

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

0 S0 O; X9 ? i# p' l

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

4 D4 {: \7 @! C% k7 Y+ ^

. g9 }4 H4 h* j" C+ ]* f% { q

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

{* n/ X( @8 d* G2 w

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

. t/ B: F9 M, G

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

% d) c/ I2 f/ E9 z

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

. w* \2 ]* w! T4 e+ E6 B% F

if(!IsLogin(OwnerData))

0 U4 }0 G2 W( F7 Q* Z& s

{

4 _: G5 w* Z. c* }

throw Exception("Please login first!");

6 H9 }; ^: q3 S! |& M: V

}

' D) u# n& M+ D7 w

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

( ?5 J1 G8 |# G) ?& O

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

6 B3 } S- i6 ]* z

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

/ _6 d9 X+ e8 x3 h0 {; p+ C

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

4 G. m6 s% l7 N0 Z

OleVariant &OwnerData设置成相应的数据

, Y& Q# _7 L' H4 ~

" z& y; ^0 K- {2 c5 ?) z

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

7 h& l3 l6 P% ~! s8 u8 K d" Y. h

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

1 v' l% _8 w5 P4 y! R

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

9 b6 l8 \, _4 V2 h- h" p8 t

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

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-8-13 05:45 , Processed in 0.393652 second(s), 52 queries .

回顶部