DCOM实现分布式应用(四)

基于 Fastjson 重复引用和循环引用所导致的生产问题 - 出现$ref引用,分析原因,提出解决办法(很透彻) 不要关闭 FastJson 的引用检测机制,很大概率会导致出现“StackOverflowError”异常 阅读详情

DCOM实现分布式应用(四)

安全性

使用网络来将应用系统分布化是一个挑战,这不仅是因为带宽的物理限制以及一些潜在的问题,而且也由于它产生一些诸如关系到客户间、组件间以及客户和组件之间的安全问题。因为现在的许多操作可以被网络中的任何一个人访问,所以对这些操作的访问应该被限制在一个高级别上。

如果分布式开发平台没有提供安全支持,那么每一个分布式应用就必需完成自己的安全机制。一种典型的方法是用某种登录的方法要求用户通过用户名及密码的检测,这些一般来说都是被加密了的。应用系统将通过用户数据库或者有关目录来确认以上用户身分,并返回动态的标识符以便用户以后用来进行方法调用。以后每次涉及到调用有安全检查的方法时,用户都需要通过这种安全认证。每个应用系统都要存储和管理许多用户名和密码,防止用户进行未授权的访问,管理密码的改动以及处理在网络上传递密码而带来的危险。 因此分布式平台必需提供一个安全性框架来确切地区分不同的用户或者不同组的用户以便系统或应用有办法知道谁将对某组件进行操作。DCOM使用了Windows NT提供的扩展的安全框架。Windows NT提供了一套稳固的内建式安全模块,它用来提供从传统的信用领域的安全模式到非集中管理模式的复杂的身份确认和鉴定机制,极大地扩展了公钥式安全机制。安全性框架的中心部分是一个用户目录,它存储着用来确认用户凭据(用户名、密码、公钥)的必要信息。大多数并非基于Windows NT平台的系统提供了相似或相同的扩展机制,我们可以使用这种机制而不用管此平台上用的是哪种安全模块。大多数DCOM的UNIX版本提供了同Windows NT平台相容的安全模块。

安全性设置

DCOM无需在客户端和组件上进行任何专门为安全性而做的编码和设计工作就可以为分布式应用系统提供安全性保障。就象DCOM编程模型屏蔽了组件的位置一样,它也屏蔽了组件的安全性需求。在无需考虑安全性的单机环境下工作的二进制代码能够在分布式环境下以一种安全的方式工作。 DCOM通过让开发者和管理员为每个组件设置安全性环境而使安全性透明。就象Windows NT允许管理员为文件和目录设置访问控制列表(ACLs)一样,DCOM将组件的访问控制列表存储起来。这些列表清楚地指出了哪些用户或用户组有权访问某一类的组件。使用DCOM的设置工具(DCOMCNFG)或者在编程中使用Windows NT的registry以及Win32的安全函数可以很简单地设置这些列表。 只要一个客户进程调用一个方法或者创建某个组件的实例,DCOM就可以获得使用当前进程(实际上是当前正在执行的线程)的用户的当前用户名。Windows NT确保这个用户的凭据是可靠的,然后DCOM将用户名正在运行组件的机器或进程。然后组件上的DCOM用自己设置的鉴定机制再一次检查用户名,并在访问控制列表中查找组件(实际上是查找包含此组件的进程中运行的第一个组件)。如果此列表中不包括此用户(既不是直接在此表中又不是某用户组的一员),DCOM就在组件被激活前拒绝此次调用。这种安全性机制对用户和组件都完全是透明的,而且是高度优化的。它基于Windows NT的安全框架,而此框架是Windows NT操作系统中最经常被使用(也是最完美的!)的部分,对每一个对文件或者诸如一个事件或信号的同步线程的访问都需要经过相同的访问检查。Windows NT能够和同类的操作系统以及网络操作系统竞争并超过它们的事实可以显示出这种安全性机制是多么有效。

图13 安全性设置

DCOM提供了一个非常有效的缺省的安全性机制,它使开发员能够在无需但心任何安全性问题的情况下开发出安全的分布式应用。

对安全性的编程控制

对某些应用系统来说,仅仅是组件级的访问控制列表是不够的,因为一个组件中的某些方法是只能被特定的用户访问的。

例子:一个商务结算组件可以有一个方法用来登录新事务,以及另一个方法用来获得已经存在的事务。仅仅只有财务组(“Accounting”用户组)的成员才能够添加新事务,同时仅仅只有高级管理人员(“Upper Management”用户组)才能查看事务。

正如上一部分所说,应用系统能够通过管理自己的用户数据库以及安全凭据来达到本身的安全。然而,在一个标准的安全框架下工作将会给最终用户带来更多的好处。没有一个统一的安全性框架时,用户需要为他们所使用的每一个应用记住和管理相应的登录凭据。开发者为每一个组件靠虑到安全性问题。

DCOM通过加入Windows NT提供的非常灵活的安全性标准将安全性用户化的要求简化为对某些特定组件和应用的需求。

使用DCOM安全性标准的应用达到上面例子所要求的有所选择安全性呢?当一个方法调用来到时,组件要求DCOM提供客户的身份。然后根据其身份,被调用线程就仅仅执行允许该客户执行的安全对象中的某些操作。接着组件就试着访问诸如登录字之类的安全对象,这些对象中有一个访问控制列表ACL,如果访问失败,说明客户不在ACL中,组件就拒绝方法调用。通过根据所调用的方法的不同而选择的不同的登录字,组件就能够用一种非常简单,但却灵活而有效的方式提供有选择的安全性。

图14 使用登录字的安全接口

组件也能够很轻易地得到客户的用户名并且利用它在自己的数据库中查找有关的许可和策略。这一策略使用了Windows NT的安全性框架(密码/公钥,传输线上加过密的密码等等)所提供的鉴定机制。应用系统无需为储存密码和其它有关的敏感信息担心。新版本的Windows NT将提供一个扩展的目录服务,它允许应用系统将用户信息存储到Windows NT的用户数据库中。 DCOM的做法更为灵活。组件能够要求不同级别的加密以及不同级别的鉴定,同时可以在自己进行身份认证时阻止组件使用自己的凭据。

Internet上的安全性

设计在Internet上公作的应用系统时需要面对两个主要问题。

  • 使是在最大的公司,在Internet上用户的数量都会比原来提高好几个数量级。
  • 最终用户希望对他们所使用的所有应用使用相同的公钥或密码,即使这些应用是由不同的公司所提供的。提供服务的公司不能在应用系统或安全性框架中储存用户的私人密码。

    DCOM的灵活的安全性结构怎样帮助应用来解决这些问题呢?对于这一问题,DCOM使用了Windows NT的安全框架(参看安全性部分)。Windows NT的安全性体系结构提供了多个安全性模块,其中包括: Windows NT NTLM鉴别协议,它在Windows NT 4.0以及以前版本的Windows NT中使用。 Kerveros Version 5鉴别协议,它在处理Windows NT中以及Windows NT间的访问时代替NTLM成为最主要的安全性协议。 分布式密码鉴定(DPA),诸如MSN和CompuServe这些最大的Internet成员组织中的某些公司所使用的共享的密码鉴别协议。 安全性通道服务,它被用来完成Windows NT 4.0中的SSL/PCT协议。下一版本的Windows NT将加强对支持SSL 3.0客户鉴定系统的公钥协议的支持。 一个DCE提出的安全性模块,它可以作为第三方工具加在Windows NT中。

    所有这些模块都是在标准Internet协议上工作的,都各有其优缺点。NTLM安全性模块以及在Windows NT 5.0中替带它的基于Kerberos的模块都是私人密钥基础协议。它们在集中式管理环境以及使用相互或者单方面信任关系的基于Windows NT服务器的局域网中是非常有效而安全的。对大多数UNIX系统来说,都可以使用NTLM来进行商业实现。(例如AT&T的“Unix系统的高级服务器(Advanced Server for Unix Systems)”)。

    使用Windows NT 4.0的目录服务,可以很好地扩展到大约100000个用户。使用Windows NT 5.0的扩展目录服务,一个Windows NT域控制器可以扩展到大约一亿个用户。通过将多个域控制器结合到Windows NT 5.0的目录树中,在一个域中所能支持的用户实际上是无限的。 Windows NT 5.0的基于Kerberos的安全性模块引入了例如在客户进行身份认证时对组件行为的控制等更先进的安全性概念。它在执行鉴别时比NTLM安全性提供模块所占用的资源更少。 Windows NT 5.0还提供了基于安全性模块的一个公共密钥。这一模块可以在基于Windows NT的应用以及基于DCOM的应用中将对于安全性凭据的管理分布化。使用公共密钥进行身份鉴别不如使用私人密钥有效,但是它允许在无需储存客户的私人凭据的情况下进行身份鉴别。 因为有如此多的互不相同的基本的安全性提供模块(私人密钥,公共密钥)可以被使用,所以基于DCOM的分布式应用系统可以无需对其进行任何改动就能完成甚至更为先进,对安全性敏感的应用。Windows NT的安全性框架使得无需牺牲灵活性和执行性能就能很容易地扩展应用并保证应用的安全性。

深入剖析 Python 引用计数与垃圾回收机制:解锁内存管理的奥秘 Python 的内存管理机制结合了引用计数、标记 - 清除和分代回收,在提供相对高效的内存管理的同时,也较好地解决了循环引用等问题。与其他语言相比,Python 的自动内存管理机制使得开发者无需过多关注底层内存操作,提高了开发效率,但在一些对性能和内存控制要求极高的场景下,可能不如手动内存管理的语言灵活。 阅读详情

相关推荐

C++ 引用计数(reference count) 实现智能指针

前面说到,含有指针成员的类容易出现悬垂指针的问题,特别是类的对象有复制,赋值等行为时; referecen count 的核心思维是,使用一个计数器来标识当前指针指向的对象被多少类的对象所使用,即记录指针指向对象被引用的次数; 构造函数中创建类的新对象时,初始化引用计数为1; 复制构造函数复制指针,并使相应的引用计数增加1; 赋值操作减少左操作数所值对象的引用计数,增加右操

所有内容都已迁移到 https://huqijun.org 1388

使用vb建立DCOM服务器端及客户端应用的详细过程(3)

使用vb建立DCOM服务器端及客户端应用的详细过程(3) 分发服务器DCOM应用:   事实上,你已经可以在你的机器上运行程序了.如果你能在两台机器上测试你的应用,它更能表达DCOM分布的特点,在两台机器上,请按下列方法进行:    1.启动"Package & Deloyment Wizard"安装打包工具   2.单击"Browse",选择C:/DCOMDemo/Serve

yangsaibing的专栏 1596

使用socket写一个简单的聊天程序&碰到的问题

程序分成2个部分:1,服务端,用来接受客户端发来的信息2,客户端,用来向服务端发信息。一、服务端如下:SocketServerThread.java用来处理客户端发送的信息package com.thread.socket.service; import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu...

LemonCake的博客 3356

DCOM原理

1、DCOM       COM的进程透明特性表现在组件对象和客户程序即可以拥有各自的进程空间,也可以共享同一个进程空间,COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确性。组件对象和客户代码不必考虑调用传递的细节,只要按照一般的函数调用的方式实现即可。如果进一步拓展进程透明特性,考虑组件对象与客户程序运行在不同计算机上的情形,把进程透明性拓展为位置透明性,形成分布式组件对象模型

frank_zu的专栏 3232

Excel中$符号的底层逻辑与三大引用实战

在电子表格建模中,单元格引用方式是决定公式稳定性的核心机制。相对引用、绝对引用和混合引用并非操作技巧,而是Excel地址解析引擎对坐标维度(行/列)稳定性声明的技术实现。理解$符号的本质——即控制行列坐标的‘可变性’而非简单‘加锁’——是避免VLOOKUP查不到、SUMIFS汇总错行、动态图表数据偏移等高频问题的关键。它直接关联金融建模精度、跨表数据一致性及自动化报表鲁棒性。本文结合销售提成、库存预警、薪酬核算等真实业务场景,系统拆解$A$1、$A1、A$1三类引用的适用边界与排错路径,帮助用户从机械记忆升

weixin_30888413的博客 319

如何实现一个简单的智能指针

所谓智能指针指的是一种用起来像指针但又无需关心内存管理的一种机制。   普通指针的问题 C/C++中指针极为常见,但普通指针最大的问题就在于需要程序员记住分配内存后要手动释放,否则就会有内存泄漏或者引用野指针的风险。 比如有这样一个简单的类: class person { public: person() {} ~person(){ cout<<"delete...

码农的荒岛求生 1520

COM原理及应用----分布式COM(DCOM)

1、DCOM      COM的进程透明特性表现在组件对象和客户程序即可以拥有各自的进程空间,也可以共享同一个进程空间,COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确性。组件对象和客户代码不必考虑调用传递的细节,只要按照一般的函数调用的方式实现即可。如果进一步拓展进程透明特性,考虑组件对象与客户程序运行在不同计算机上的情形,把进程透明性拓展为位置透明性,形成分布式组

snail8384的专栏 1841

符号引用重定位 重定位PC相对引用 简单讲解

目录链接符号引用重定位简介例子重定位条目简介offsettypesymboladdend重定位PC相对引用重定位PC绝对引用 链接符号引用重定位 简介 我们知道一个.c文件可以被编译为.o文件,即目标文件,而假如一个.c中引用了别的.c中的函数或者是变量,这时候的.o其实是不知道引用函数实际的内存位置的,也就无法跳转,这就需要【重定位】的操作了,而针对函数名(也是符号)的重定位 例子 我们编写两个.c文件,分别是main.c和func.c,main.c引用了func.c中的func函数 // main.c

AKGWSB 's blog 3968

C++引用

类型 &引用名 = 引用实体(变量名);。引用在定义时必须进行初始化,并且一旦初始化后,就会一直引用该变量,不能再引用其他变量。// 定义一个引用 ref,它是 num 的别名// 通过引用修改原始变量的值ref = 20;return 0;在上述代码中,ref是num的引用,对ref的操作实际上就是对num的操作。注意引用类型必须和引用实体是同种类型的。对于基本数据类型(如intdouble等),传值和传引用的效率差异通常不大。

weixin_62709090的博客 2029

esmodule循环引用问题

最简单的 a 引用了 b,b 又引用了 a,这就产生了循环引用。复杂点的无非就是链路长一些,例如 a -> b -> c -> d -> a。循环引用可能会导致内存栈溢出。但也不是一定会有问题,比如 b 导出了两个方法,a 引用的是 b 导出的方法 fn1,而 b 是在方法 fn2 里引用的a,这种情况其实是不会有问题的。但由于可能的风险,且难以发现,所以编写代码时还是尽量规避使用循环引用。

加油啊,为了每一天。 1941

shared_ptr循环引用问题以及解决方法

shared_ptr循环引用问题以及解决方法一、shared_ptr循环引用问题例子一例子二例子三二、weak_ptr解决循环引用问题 一、shared_ptr循环引用问题 什么是循环引用,两个对象相互使用shared_ptr指向对方。造成的后果是:内存泄漏 例子一 下面是循环引用的例子 #include <iostream> #include <memory> using namespace std; class A; class B; class A { public:

菊头蝙蝠的博客 8905

[Android] Android开发优化之——使用软引用和弱引用

Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。这里重点介绍一下软引用和弱引用。如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用

::: 移动互联网时代开发者 ::: 6万+

C++引用(变量引用、数组引用与数组指针、引用本质-指针常量、常量引用)

文章目录1 引用的基本用法2 引用注意事项3 引用做函数参数4 引用做函数返回值5 引用的本质6 常量引用 1 引用的基本用法 作用:为变量起别名。 语法:数据类型 &别名 = 原名; 示例: int main() { int a = 5; int &b = a; //引用:为变量起别名 cout << "a = " << a << endl; //5 cout << "b = " << b << endl;

NewsomTech 6569

C++类的交叉引用问题

注:类的交叉引用本身就是一种不好的设计,BUT……如果我们非要这么用…… 1、错误的实现方法: main.cpp #include #include "class_a.h" #include "class_b.h" int main() { A aa; aa.InvokeB(); B bb; bb.InvokeA(); } class_a.h #ifnde

TITANIC上的小景 8728

Java垃圾回收--强引用、软引用、弱引用、虚引用 详细

1、引出为什么要有这么多引用? 我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。 2、既偏门又非常高频的面试题 ,问题:强引用、软引用、弱引用、虚引用有什么区别?具体使用场景是什么? 在JDK 1. 2版之后,Java对引用的概念进行了扩充将引用分为强引用(StrongReference)、软引用(Soft Reference) 、弱引用(Weak Reference) 和虚引用(Phantom Reference) 4种,这.

qq_43012792的博客 5039

C++拾遗--引用(左值引用、右值引用)

C++拾遗--引用 前言 引用就是别名(alias)。所谓别名,就是对已存在的对象另起一个名字。本身含义并不难理解,但与其它概念一组合,就成了使用难点。再加上新标准提出了新的一种引用-右值引用,引用这一概念就变得更加难以理解和使用。 正文 随着新标准(新标准往往就是新的技术)的提出,引用这一概念分成两类:左值引用、右值引用。其中左值引用是最常用的一种,而右值引用则是语言使用上的一种革新。 1.左值引用 左值引用的基本语法 Type &引用名 = 左值表达式;

CCPP Blog 4590
上一篇: DCOM实现分布式应用(五)
下一篇: DCOM实现分布式应用(二)
cloudred
博客等级 码龄26年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值