我的asp.net经验之谈

asp.net技术相关

博客园 首页 管理
  100 Posts :: 0 Stories :: 1283 Comments :: 44 Trackbacks

面对权限,我们要解决几个的问题。

第一个就是:我们的软件里面有哪些功能? —— 给用户自己维护角色作准备

比如添加新闻、添加产品、客户信息维护、合同管理等等,当然还可以细分一下,
客户信息维护又可以分为:客户基本信息、客户的联系人、客户报价、客户的合同等。

我的习惯是建立一个表,叫做功能结点表。
这个表可以生成左面的功能树,也可以记录项目里面一共有哪些功能。
这里的一个功能指的是两个页面,一个是列表页面,一个是表单页面。
列表页面包括查询、导出数据等功能,表单页面又可以再往下继续划分,就是可以在包含子功能结点。

这样一个项目里的功能就全部记录到了一个表里面。

功能结点表的主要字段
FunctionID
ParentID
Title
URL
...

其它字段略。


第二个问题:哪些人可以访问到那些功能结点?

这个问题呢就要引入“角色”或者“用户组”的概念了。

我们建立一个角色表来记录一个角色拥有的功能结点。
我们可以写一个程序,让客户自己来维护,也就是说用户可以自己添加、修改“角色”。

然后把人员和角色关联起来就可以了。

角色表的主要字段
RoleID
TItle

角色拥有的功能节点表得主要字段
Role_FunctionID
RoleID
FunctionID


第三个问题:详细权限的划分

一个页面可能会有很多的功能,比如可以查看、查询、添加数据、修改数据、删除数据(又可以分为逻辑删除和物理删除)、导出数据等。

而一个人(或者说是角色)来到这个页面后(获得了访问权限),不一定会拥有上面的全部的权限。
这样就需要再详细区分一下。

这样的话我们在加一个字段就可以了,通过这个字段来判断登录人有哪些具体的权限。

角色拥有的功能节点表得主要字段
Role_FunctionID
RoleID
FunctionID
详细权限



第四个问题:资源的访问权限

这个我还没有想好怎么解决。

就是说同一个页面,业务员只能看到自己的客户信息、并且可以维护,

然后业务一部门的经理只能看到业务一部门的业务员的客户信息,不能看到其他业务部的客户信息

再然后是业务部的总经理,他可以看到所有业务员的客户信息。

最后就是,不知道大家有没有遇到过“内勤”这个职位,就是说业务员只管联系客户,不用自己录入客户信息,

而往电脑里录入信息的工作就全交给内勤了。

再往下说就更烦了,一个业务部可能只有一个内勤,也可能有多个内勤,一个内勤会对应多个业务员。
好了先不说了,好像有点跑题了,这个就当作是特利吧。


前三个问题都不需要引入部门的概念,但是第四个问题就不得不考虑部门了。


以上是我的思路,不知道能不能把权限的问题,从粗粒度上说清楚。

有不对的请指出,大家一起研究。

posted on 2008-04-29 13:36 金色海洋(jyk) 阅读(2478) 评论(22)  编辑 收藏 所属分类: 通用权限

评论

#1楼  2008-04-29 14:11 lzppcc [未注册用户]
可以查看http://framework.supesoft.com
  回复  引用    

#2楼  2008-04-29 14:12 zbh [未注册用户]
功能表
角色表
角色与功能的关系表

我反正这么弄的
  回复  引用    

#3楼 [楼主] 2008-04-29 14:14 金色海洋(jyk)      
@lzppcc [未注册用户]
原来是广告,讨论问题可以,但是不要做广告!


  回复  引用  查看    

#4楼  2008-04-29 15:41 怪怪      
资源访问的问题可以参考Windows的ACL, 关键是你首先要建立内容节点的模型和权限定义。

另外, 功能访问的部分,Community Server里那种功能定义的方式也不错, 用BitMask来做, 比单纯的利用数据库要高效一点~
  回复  引用  查看    

正需要这个,支持好文章!
  回复  引用    

#6楼 [楼主] 2008-04-29 16:40 金色海洋(jyk)      
@ 怪怪
好久没见到你了,忙什么呢?
分页控件的看了吗?
还有数据访问函数库的?

内容节点已经有了,
权限定义?是不是我说的角色呀?是的话,角色是要有客户自己定义的,我们提供一个维护程序。


  回复  引用  查看    

#7楼  2008-04-29 17:46 good man      
能不能把你的数据库图列出来,看文字不好看啊

没有图哪么的直关哟

  回复  引用  查看    

#8楼 [楼主] 2008-04-29 18:00 金色海洋(jyk)      
关于图吗,我得整理一下。
有些信息是要屏蔽一下的。
  回复  引用  查看    

#9楼  2008-04-29 18:34 将飞      
我权限部门的做法是:
页面表(只分了两层大类-->小页面,当然也可以做递归,我懒得弄,也够用了)
操作表(添加,删除,修改等)
权限表(页面ID,操作ID)

然后就是角色对应权限表了.

关于数据的访问权限,那位大哥给提供个源码或页面呀!
  回复  引用  查看    

#10楼  2008-04-29 18:41 怪怪      
@金色海洋(jyk)
我说的不妥,其实我指的是这个节点可以进行的操作。

其实你可以自己体会一下, 就是右键单击一个文件, 属性->安全, 里面的方式。关键比较复杂的部分, 可能是权限的继承等部分, 但是我觉得如果有这种需要, 构建这么一整套还是值得的。

数据类那个,只要够用, 我没啥意见; 不过分页控件, 我觉得是耦合了表现和数据持久化, 有点不妥; 不过想要保留这种方便, 可以做两个版本, 就好比SqlDataSource和ObjectDataSource。

我还是那点事, 只是感觉江郎才尽, 不思考一阵子就没啥可说的啦~
  回复  引用  查看    

#11楼  2008-04-29 19:00 森要 [未注册用户]
--引用--------------------------------------------------
lzppcc: 可以查看<a href="http://framework.supesoft.com" target="_new" rel="nofollow">http://framework.supesoft.com</a>
--------------------------------------------------------
7)每个模块的栏目对应一个目录, 栏目的权限抽象分为(查看/新增/修改/删除/排序/打印/备用A/备用8).

你这种控制权限的方式很不合理,不适用于稍复杂一点的项目。

  回复  引用    

#12楼 [楼主] 2008-04-29 19:26 金色海洋(jyk)      
@ 怪怪
>>构建这么一整套还是值得的。

这个我也同意,但是问题是如何让客户操作方便。总不能一个文件一个文件的设置吧。
用户都是很懒的,有部门(组织机构)了,经理在部门里面,业务员也在部门里面,那么为什么还要在做设置,才能达到部门经理可以看到部门里的业务员的信息?


>>耦合了表现和数据持久化
偶合就耦合吧,不好吗?

用着方便就可以了。

另外显示数据怎么出来持久化了?
对于多种数据库吗?
在vs2003里面还没有太好的方案,我主要考虑是效率,不考虑效率的话就没有问题了。

换数据库,换一个数据访问库和分页算法就可以了。

只是现在还没有整理代码。

  回复  引用  查看    

#13楼  2008-04-29 21:34 亚历山大同志      
参考参考WSS的权限系统
  回复  引用  查看    

#14楼  2008-04-29 23:39 怪怪      
@金色海洋(jyk)
不是, Windows也没让咱一个一个设置不是? 子节点继承父节点。 部门的问题当然要配合用户组什么的。 当然具体实现还是得根据你们的具体情况。

持久化(比如数据存取)是一个范畴, 数据显示和界面操作是另一个范畴。 比如你的Pager,如果我用来显示内存里的数据的话, 怎么办? 那些和数据存取耦合的部分就多余了。
  回复  引用  查看    

#15楼 [楼主] 2008-04-30 06:43 金色海洋(jyk)      
目前不支持内存数据。

你是想说缓存数据把,我觉得在分页这一块,缓存数据是没有什么必要的。

因为SQL Server 就已经缓存过一遍数据了,我觉得我们没有必要再缓存一遍。

我在做海量数据分页的时候注意观察了一下内存的暂用情况,在索引设置合理的前提条件下,查看前1000页数据的时候,sql Server暂用的内存是非常少的,

只有60M 到 120M 。



当然了,如果是web服务器和数据服务器不在同一台电脑上的情况我还没有考虑。



如果你说的不是缓存数据的话,那么我的这个控件只支持从数据库里提取数据。

吴旗娃的那个分页控件是要做到在很大的范围内都可以用的目的。

而我的这个,只要求在一定的范围内,使用简单、运行高效,就可以了。

对于其他的范围,我可以在做一个分页控件。

是不是单一职责呢?


  回复  引用  查看    

#16楼  2008-04-30 09:56 香 妃      
理解和沟通很重要。怪怪说的是你的分页控件设计上面可以更加合理点。要对修改关闭,扩展开发。也就是UI是UI(pager是control),数据源持久是另外范畴。你要做到很灵活方便的能扩充支持数据源在数据库,内存或者xml等等。。
  回复  引用  查看    

#17楼  2008-04-30 10:16 镜涛      
模块
权限更能
角色
相互关系
  回复  引用  查看    

#18楼  2008-04-30 10:50 jyk [未注册用户]
我知道怪怪的意思,估计怪怪也知道我的意思。

分开倒是好事,但是,对于分页这种情况要怎么分呢?

UI:两个部分,一个是显示数据,交由DataGrid这一类的控件来实现,分页控件只提供数据源。
另一个是总记录数、上一页、下一页、页号导航这一类的,这个由分页控件实现。

逻辑:有没有逻辑呢?有的话,那就是SQL语句了,就是具体的分页算法。如果您觉得sql语句算作持久化的部分呢,那我就找不到什么逻辑部分了。

持久化(数据层):同上。

再有就是应对多种数据库,还有就是xml,还有ajax分页。

乱了,先不说了。



  回复  引用    

#19楼  2008-04-30 11:12 痴情客      
权限设计是 相对复杂的一个东西
  回复  引用  查看    

#20楼 [楼主] 2008-04-30 19:50 金色海洋(jyk)      
我没有觉得有太复杂,我的第二个项目就使用类似的思路来实现了。
  回复  引用  查看    

#21楼  2008-05-27 23:20 编程的夜猫      
好文章,正是我需要的,
  回复  引用  查看