本星期第三个300分,求一个好思路 /老吴(300分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,是关于权限设置的好算法的。

这个问题大凡写过数据库程序的人,都会遇到的。
不同的级别有不同的访问权,管理员的、操作员的。。。
不同的部门不能访问其他部门的资料,产品打折时,级别低的
只能打小的折,再大点的折就要上一级授权,等等。
我以前的做法,和不少人一样(呵呵),都是在程序里就把权限分
好的,管理员可以干这些,操作员只能干那些。然后把各个员工分上
等级。够简单,方便。但现在不行了。:(
现在有更高的要求了,要求程序中的每一个选项,都有自己的读写权限,
并且这种权限是可以随时设置的(看上去有点象NT的权限设置),稍高点的
可以向稍低点的授权。稍低点的访问稍高点的时,输入稍高点的密码,可以在
本次操作时暂时获得稍高点的权限,操作结束,又恢复原来的权限。
很重要的一点,要求权限设置必须尽可能独立于其他模块。在其他模块中
不要把权限写死。而且权限设置必须写入“服务端”,如果写在客户端,很可能
别人用第三方的数据库程序,就轻易的“攻入”数据库里了。但是在客户端程序
中,必须有权限设置的模块给用户来设置。
不是什么高级大问题,但是很实际,很多人都遇到过的。我想集大家的智慧,搞
一个“最终解决方案”,不知大家肯赏脸不?
分不够可以再加!
 
建立个数据库,将各模块的权限定义,功能项也用定义的方式。
这样产生的组合可应付绝大多数的情况。
 
如果是按照aerobull的做法,人家用第三方的数据库程序,可以轻易攻破的。
 
为何不用数据库的用户权限设置功能,这样第三方的软件不能“功入”。为每个用户设置
一个用户和密码(数据库中的)。
 
信息写入数据库前先加密字符串,用到时再解开
数据库始终在服务器上
 
你把权限数据库放服务器端,加上访问密码或用其他手段保证只有你的服务器端程序
可以正常调用。

客户端访问时通过与服务器端通讯校验密码和权限。

权限数据库的设置时要注意到未来的可能扩展,比如从每一个操作或数据都有3种权限
(none,read,write)-->每一个操作或数据都有6种权限(none,read&不能分配下一级权
限,read&分配下一级权限,write&不能分配下一级权限,write&分配下一级权限,分配下
全部权限)
 
这是一个信任度的问题,作为用户,应当认为他的服务器端是安全的。

:aerobull的做法是最实际的。所谓第三方工具攻入问题。在服务器端有了sa权限
什么不能干?

你的产品卖给了用户,就等于把你的数据库结构给了用户。如果连你的用户的服务器
端也不信任,只好加密了。你可以才有另外加密文件的保存在服务器,这样别人的
“第三方数据库”程序就不能读你的权限了。
我知道好多涉及到帐务的问题都采用这种方法校验的。

安全是个相当的概念,比如linux,在提供网络www,ftp服务时的安全性是比较好的。
但他的一个特点是任何一个人在这台计算机前,只要他能开机,就可以任意进入系统。
不象NT。必须有口令。这是他的设计思想造成的。(认为服务器本身是处于安全的
可管理的环境中)不是他的安全漏洞。
 
我们可通过编程序来设置权限,设置各类权限,使各用户只执行他的范围内的东西,
但所有的东西都是在网络已安全的基础上进行的。
大家假设一下:如果对方单位的admin将数据库都搞乱了,你说怎么办。
我们的权限只是为了使用户各单位,个人之间的工作更协调,更能明确责任,
大家以为如何?
我们将精力放在如何使各功能模块与权限定义如何更好的结合起来,如何更好的编程组织.
噢,还有,不把超级用户的密码给人家的话,结帐时会多一些麻烦。钱的教训啊!
 
我是来听课的。
那位大虾开讲!
 
我想老吴的话没有说清楚,他的意思是怎样把一个权限的值(整数值或字符串)同
程序的某一部分功能直接联系起来。我想要这样的话,就必须使用用户,组,域,
这样的一些概念,也就是说在你的程序中给用户分组,就向nt那样。属于哪个组,
就会相应的具有那个组的权限,各种权限一叠加就出来这个用户到底能干什么,不
能干什么了,我记得一个考试系统就是这样做的,不过那个东西有个大bug,很容易
就进去了,呵呵,我差一点没成了评卷老师——没敢!
 
aerobull的方法是可以的,如果第三方程序可以访问你的数据库,已经没有安全可言了。
我以前做过的系统思路基本同aerobull一样。
用表来维护系统的模块和用户的权限,这样有一个好处是灵活,可以随时修改某个用户
的权限,可以应付客户稀奇古怪的要求。
模块的开发不需要考虑权限问题,由总程序调用时来判断。
 
我先申明一下:
》》你的产品卖给了用户,就等于把你的数据库结构给了用户。如果连你的用户的服务器
》》端也不信任,只好加密了。你可以才有另外加密文件的保存在服务器,这样别人的
不是我不信任,而是客户的老板对他的员工不信任。所以才要加权限啊。
另: 单从客户端或利用数据库权限来限制,我想都不符合要求。一方面,数据库确实
要用他的权限设置来做,另一方面,在客户端上,需要象lczhuohuo所说的组、域
的方法。是两者的结合(所以这个问题才是300分啊 :) )。我用SQL SERVER7
它本身也有一个个用户组,但不能照抄啊,老板是看不懂什么DBO、SYSADMIN组之类的
东东的。:)他只知道有老板、部门经理、出纳。。。
 
在SQL数据库中自己建表维护吧,精确到使用的程序.
我们的MIDAS的权限就是这么处理的.
 
我自己已经总结出了“最终解决方案”:
我现在做的所有MIS都是在一个Operators表里用一个操作权限字段搞定所有
权限需求。其实我这个权限字段实际上就一个集合,如“A权,B权,C限”等等。
然后我在代码中用一个通用的 Operator 类。该类的方法主要有:
Op.Login(Name, Pwd)
Op.Logoff
Op.HasPrivileges({A权,C限, ...})
...
关于各用户(操作员)的具体权限设置,没有必要在客户端进行,因为这部分属于
系统工具中的模块,所以只用放在中间服务器端即可。

另外,除非绝对只用于局域网的应用,否则根本不能指望 NT 和 DCOM 的安全机制。
 
》》Op.HasPrivileges({A权,C限, ...})
这个意思是...
 
__________________________________________________________________________
我先申明一下:
》》你的产品卖给了用户,就等于把你的数据库结构给了用户。如果连你的用户的服务器
》》端也不信任,只好加密了。你可以才有另外加密文件的保存在服务器,这样别人的
不是我不信任,而是客户的老板对他的员工不信任。所以才要加权限啊。
__________________________________________________________________________
老板不信任员工自然就不会给他sa的权限。总有个信任的人--或者自己。
只有sa才能进入你的系统(必须首先假定你的系统是安全的,否则讨论这个问题
就没意义了),也只有sa才能修改你的权限表。这样的安全性应该够了。
任何第三方的工具都要知道sa的密码才能对数据库操作。

极端一点,sa的密码不告诉任何人。这个数据库只有一个用户-sa。
这样只有你的程序使用sa用户才能连到数据库。你的程序你要信任的。
在这种情况下,程序可以把sa口令保存在服务器端。server端
运行一个监听程序。在客户程序初始化时候通过sock编程把sa密码加密传过来。
这样就只有你的程序在运行期间可以连接到server数据库了。数据库中
有专门的权限表。针对各模块做功能限制。
(aerobull 的做法是大家正在用的方法)我现在开发的东西就用的这方法。
只不过没有加密罢了。
呜呜呜~~~,快分赃吧! 8-)
 
在你的数据库表中每一个表中添加一个字段,用于对该记录的控制,那你就可以随
你的便控制了,是不是?
 
我是来听课的 ...

俺从最低层的磁盘文件来看,不管怎么处理最终都要写到硬盘上的,只要在硬盘上
都是可以读出来的 只是概率不同 --- 如果这些“权限”数据经加密计算后
能写回原exe就比较好了
你的软件功能模块不多,一个字节差不多可以记录各模块和设置的权限(
给模块编上号---6个bit足够表示了,用2个bit 记录各模块的A.B.C权限 形如:
01 = 'A'
10 = 'B'
11 = 'C')
exe文件的头部有很大的空间(几乎没什么用),你可以把信息写到那儿
当用户修改了权限 --- 在这个事件处理过程中激活一个运行于后台的exe(接收修改信息)
并提示重新运行软件使新的设置生效。那个被激活的exe监视到该程序关闭时 立即修
该他的文件头 完后自己退出

---------------------------------------------------
嘿嘿 实现起来比较不容易吧
不过作为一个软件工程 在系统集成时应该有集成的
说说而已 敬听高见
 
应用系统 --》 权限系统 --》 资源系统
应用系统通过权限系统访问你所需要权限管理的资源,否则不可访问。
由权限系统由某种方式管理资源系统的取用。

简单的实现方法时在所有要使用某个资源时候提交当前的用户或者临时口令。
权限系统审核,记录log文件后发出可用和不可用的信息。
复杂方法是象nt一样在资源和应用中间附加一个层次。
 
1 aerobull
2 三代坦克
3 z_cd
4 soul
似乎有四种答案。大家好象倾向与自己定数据库,来设权限。没错,这个方法确实
简单灵活。
有人赞成用数据库本身的权限来设定吗。
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
875
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部