QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

/ X1 H$ Z' z/ J: T% C4 [

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

& P+ Y/ t* y) B, n& j# C

% J$ |* r4 f4 R( u

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

/ G4 a+ B9 Q# j( a4 D4 |% }& v) H

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

# d! `1 W' \' O [, M$ t

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

6 M0 _! N, R2 @

考察一个实例

* N6 B# d' }. O; B) ^% o

5 _4 l4 w7 k5 ^% t+ [

class ATL_NO_VTABLE TLoginServerImpl

! E& n( T) P+ a+ X$ |5 h7 i2 s

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

C' n& F6 V L, H" ^1 }% C

Server),

5 G, P, Y: R% @) o1 ^

public IConnectionPointContainerImpl<TLoginServerImpl>,

" ]/ A: h. K |

public TEvents_LoginServer<TLoginServerImpl>

: S& J! x" [# q5 F7 o7 ~2 S; w

{

5 e" R+ J8 a% {+ O! N; M

...

+ n' b* @3 R" h6 n" n/ |' s. f

}

/ l0 ]& h, }& \

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

) J% b# r) r0 s

) I" g3 U7 p. M' z6 t

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

. W8 S# y0 V+ |9 U; D& Q

public CComObjectRootEx<CComObjectThreadModel>, \

5 r, D& ~9 c5 Y8 R7 B

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

$ o" X' a, b2 m7 r9 z" }* V6 ?

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

0 I2 q+ z" M% w0 n/ {

LIBID_OF_##CoClass>

1 W8 D1 N4 s- ? K6 z% G1 F! d& b

z2 H# E$ g! e f; x. p& A: U1 B

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

_1 e) J8 F$ l3 V

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

c0 y) U$ W* I

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

( A% Z+ D) P# O3 i$ ? y/ }) W

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

) \! u& @/ G0 h& j) J

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

( b f/ N) j/ Y0 ]( M- Q; x5 {

' Q/ X0 X) m4 N

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

$ _! _. l8 A) a1 @1 A) M; M

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

, C% x5 ?0 {2 O; ^! y* ?1 V& M

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

7 V" f2 k$ r. _/ v! }% [8 U

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

" s, G' c5 q& r" J' @( D

0 }- g% B% e9 ]/ u- B v

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

/ c+ D& u# x3 u. E0 n2 n% o

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

7 I- Q/ Z( F2 f3 T

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

) \+ I" G: q R+ _" }5 `- q8 I

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

+ M5 e" A7 Z& L( r- N; e9 Q; p

if(!IsLogin(OwnerData))

5 T% C! I8 p7 d2 U( F2 w/ \6 z& X

{

0 e* K1 x2 t! T$ V

throw Exception("Please login first!");

! r, k+ i$ j+ f

}

- M: \5 ~6 e g- H, s" l: z

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

- j. R6 h x3 |: p

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

" R1 g) E; g! J/ _7 b. t

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

f9 s6 y% X5 ^2 @

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

) N* H/ T+ |8 \. O) z" D

OleVariant &OwnerData设置成相应的数据

2 M1 f% R6 C/ j3 | @- ` U$ q% x

, j* P# k6 g% B& } e: u

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

( @: L' e! U2 \9 j* s. a6 _

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

1 d+ J. Q: @- G, N' i

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

" e6 V2 d0 E* d: E

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

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 15:44 , Processed in 0.442457 second(s), 52 queries .

回顶部