十年磨一劍--從程序員到架構師

一个.net程序员,一个企业应用的开发者,喜欢系统架构,数据库,领域驱动,面向对象,表现层技术。关注重用的理论和实践。设计原则:简单,快速,适应变化能力强,表现层灵活多变...

博客园 首页 新随笔 联系 订阅 管理
  49 Posts :: 0 Stories :: 721 Comments :: 26 Trackbacks

《闲话权限设计三层境界》以权限设计为例聊了一下我对系统设计的理解过程,不过有园友在评论中问到了权限设计一些具体细节,于是就又专门就某些问题说明了一下,并同时感谢大家的关注

 

# 2010-09-27 14:17 顾晓北 回复 引用

@Kevin Zou
我刚想了一下,至少需要5个表吧(如果用关系数据库的话)?
1,用户表;
2,角色表;
3,资源表;
4,用户——角色关系表;
5,资源——角色关系表;

 

答复:

权限设计过程中的用户表是不可见的,无足轻重的,只要提供一个用户ID给权限系统即可(那些把年龄,学历什么的纳入权限设计纯属扯淡)

以一个实际例子来说

ERP系统有一个用户系统,web中也有一个用户系统

但是为了避免用户记忆这么多账号,密码,因此我们的web系统同样认可ERP用户,接受ERP的用户登录,给ERP的用户进行授权。

而在权限资料表中,权限可能是这样记录的

UserID,ObjectID

-------------------------------

sis@ERP,查询产量           --ERP用户系统中的sis用户

sis@ERP,查询订单          

850.00,管理用户           --web系统的user id 850用户

 

有这样的权限管控,只要认证过程够聪明,能够认证出sis@ERP,850.00这样的用户ID,

那权限管控过程对于是ERP用户还是web用户都是一样的处理,都是以用户ID和资源ID去找对应

至于sis@ERP到底是个什么东东,姓名是什么,Email是多少,可能只与设计权限分配的页面有关系,与权限管控真的无关

 

 

UserID除了可以表示人,它也可以是权限需求所要求的任何主体,如访问者机器的IP

如某系统只允许本厂的人查询,集团中其它公司不能查询

UserID,ObjectID

-------------------------------

172.19,查询产量           --本厂IP段

172.19,查询订单

172.17,查询电话           --兄弟厂IP段

认证过程中,只要识别出了IP,就可调用相同的权限表示逻辑完成权限管控

 

再举一个例子吧

我们的短信平台接收手机短信查询系统数据

如发送

0D01到1362585XXXX(我们的短信平台号码),则系统会自动将D01生产线现在的产量以短信方式回复

同样,也需要权限管控,要不然所有人都可以发送短信去询问产量了

UserID,ObjectID

-----------------------------------

13638384438,产量查询

13558968888,订单查询

这时的权限主体就是手机号码

 

不过因为我们的系统同一个服务,可以用短信查询,也可以在web中查询,为了给User只分配一次权限(即短信平台和web系统共用一套权限)

则可以记录用户ID的手机号码

UserID,Phone

-----------------------------------------

850.00,13638384438

54.00,13558968888

然后在认证过程中将短信号码映射到UserID,剩下的事情也就与其它权限的管控是一样了

 

举了这些例子,只想说明一件事情

权限只是一个工具

《三层境界中》说明了权限的本质是什么

权限表示可能可以抽象,但是权限管控的方法却不一定相同,只是过程却是类似,都是

---------------------------------------

a.识别出人

b.识别出物

c.调用HasPermission(人,物)判断权限

d.实施管控策略

---------------------------------------

 

同样在InsertUser方法中,也是一个管控的过程,如用户只能新增自己部门的账号

public void InsertUser(User user)

{

       string userID = AuthenticateSystem.UserID;

       if(!RightTool.HasPermission(userID,user.Dept))

             throw new PermissionException("没有” + user.Dept + “的权限”);

       … //新增用户的具体代码

}

 

 

同样,资源表的存在与否其实与权限管控也没有很大关系

很多权限管控,并没有资源表

如以URL为权限对象的管控,并不需要专门建一个URL表

以dll中某个类的某个方法,也不需要专门再建一个类方法表

权限认证过程只与识别资源有关,而与有没有资源表完全没有关系

 

所以最终就是

用户表,资源表在权限设计过程中是不必要存在的

posted on 2010-09-27 16:30 Kevin Zou 阅读(...) 评论(...) 编辑 收藏