《闲话权限设计三层境界》以权限设计为例聊了一下我对系统设计的理解过程,不过有园友在评论中问到了权限设计一些具体细节,于是就又专门就某些问题说明了一下,并同时感谢大家的关注
@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中某个类的某个方法,也不需要专门再建一个类方法表
权限认证过程只与识别资源有关,而与有没有资源表完全没有关系
所以最终就是
用户表,资源表在权限设计过程中是不必要存在的