文档访问权限设计

简介:
前言:权限设计是一个80%的程序员都会遇到的问题,比如应用系统权限,数据库的访问权限,公文流转中的审批权限,操作系统中文件的访问权限,公司内部单据的审批权限,政府机构的上下级权限等,在现实生活中,权限无处不在,无时不有。这里要介绍的是关于文档的访问权限的一种设计方案,供大家讨论,希望能起到抛砖引玉的作用。
       在公司内部,合同文件,针对某一个客户的设计草案等一系列物理的文件,组成了一个逻辑上的文档,典型的如应用系统设计中数据库设计ER图、类图、对象图等一系列的文件,在逻辑上可以称之为一个应用系统的设计文档。当类似的文档超过几百个之后,公司内部文档的管理依靠建立纸质的文档卡片来检索文件便显得比较慢了,这时一个在线的文档管理系统就成为公司这个阶段的需求,用于解决文档过多带来的诸多不便。
       在线文档管理系统的主要目标就是方便用户管理文档和互相交流,但并不是每个人都可以对任何文档查看或者修改。权限管理在这里便成为举足轻重的问题:那些是我的文档,同部门的同事对我的文档具有哪些权限,其他人对我的文档有哪些权限,其他部门的人对我的文档有什么权限,是否可以有一个特定的人或者特定的部门对我的文档有特定的权限。本文针对这些问题提供一个解决方案,其中一些必须的元素比如,用户的设计,部门的设计不在本文讨论之列,假设您已经设计的比较完善。笔者借鉴UNIX的一些权限设计的思想来讨论和解决这些问题。分两部分:
第一部分讨论权限的种类:针对每个文档,需要填写以下文档信息,比如文档的名称,作者等,之后添加附件。对于文档的操作固定分为4种:下载,删除,修改,查看。比如需要下载某个文件,就需要具备下载权限,但首先要具备查看的权限,如果没有查看权限,则就无从下载,如果需要修改某些信息,包括重新上传文件,则需要具备修改的权限。这4中权限可以使用四个位来代替,1代表有权限,0带便没有权限,比如第一个位为下载,第二个为删除,第三个位为修改,第四个位为查看,则1111就具备了所有的权限,0000则表示没有任何权限,这样的二进制位便可以以16进制的方式存储在数据库中比如使用0..A..F则在数据库中的存储只为一个字节。如果需要添加权限,那么在高位添加这个权限。Java中的Integer类中可以方便的进行移位操作,针对给出的权限的二进制位,在相应位进行&操作,判断结果是否大于0就知道是否有权限,比如10100010进行&操作,如果结果大于0,则说明有修改的权限。如果需要增加权限,则把原来的权限取出来,在相应的权限位进行或|运算,之后再存进去。这点和Unix的权限设计一致。
第二部分讨论如何授权,假设用户具备一个唯一的整形ID号,每个部门具备一个整形ID号,对于具有1000人的公司来说,部门有上百个,他们的平均ID号的长度可以假设为3位。在文档的记录中需要添加一个字段填写文档拥有者的编号(owner),以便于标示这个文档属于谁的。同时也添加拥有者所在的部门编号(dept),如果同一个人曾经在两个部门工作过,那么他在不同时期的文档应该属于不同的部门。在这些之后需要有一个文档拥有者的权限字段(ownerAuth),存储1个字节的权限信息(假设只有四种权限)。同部门的人经常需要查看,或者修改等操作,为了方便检索需要添加同部门权限(deptAuth),同样是1个字节,也要有其他任何人对该文档的权限(otherAuth),假设是一个通知,或者文档的模板,需要所有人具备读权限,使用这个方式就比较合适。如果需要对某个人授权怎么办?如果对某个部门单独授权怎么办?这里有两种方案,1.添加一个表,与文档表是多对一的关系,这样就可以把一个文档授权给多个部门,或者多个人。2.添加两个字段,usersAuth,deptsAuth,注意,auth之前有个s,表示存储多个人或者部门的权限。存储的内容为ID号加权限,比如usersAuth中的100:f101:A,表示ID号为100的用户有用F所有的权限,以此类推,可知为单个人或者部门授权需要6个字节,1k个字段长度已经可以对170多个对象单独授权,这基本上是一个操作人员的极限,操作人员不会闲的无聊把一个对象逐个的授权给170个人或者部门,属于小概率事件,实际中可以忽略不计。这两种方案中,作者偏向于第二种,优点是查询次数少,其缺点是授权对象个数有限制。如何判断一个用户对某一个文档是否有特定的权限,在这里可以根据自己的使用情况定一个优先查找顺序,比如要判断用户对文档A是否有读的权限,则可以从ownerAuth->groupAuth->otherAuth->usersAuth->deptsAuth的优先顺序查找判断,也可以按照自己的方案判断,对于otherAuth比较常用的文档系统,把otherAuth的权限判断放在第一位也许更合适。这个没有统一的准则。
以上是作者对文档权限设计的一点想法,时间仓促,没有仔细琢磨语句是否通畅,如果有说的不清楚的地方或者有不正确的地方,欢迎指教。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/227217如需转载请自行联系原作者

lili00okok
相关文章
|
4月前
|
Kubernetes API 数据安全/隐私保护
k8s学习-基于角色的权限控制RBAC(概念,模版,创建,删除等)
k8s学习-基于角色的权限控制RBAC(概念,模版,创建,删除等)
52 0
|
数据安全/隐私保护
|
Web App开发
【自然框架】通用权限的视频演示(一):添加角色,权限到功能节点和按钮
写了几个关于权限的东东,好像大家都不大理解,也不太清楚我的权限到底能做什么,所以想来想去还是弄点视频吧,就是屏幕录像,这样大家看起来就方便了吧。      为了大家便于观看视频,我先说一下视频的步骤。
1150 0
|
数据库
【自然框架】之通用权限(九):权限的验证
继续,这是第九章了。本来这张应该好好写的,不过还是先简单介绍一下吧,以后有空再补上详细说明吧。 通用权限想要写的文章目录:(这是第九章)   1、 简介、数据库的总体结构2、 介绍人员表组3、 介绍组织结构表组4、 介绍角色表组5、 介绍“项目自我描述表组”6、 权限到节点7、 权限到...
767 0
|
安全
【自然框架】 权限 的视频演示(二): 权限到字段、权限到记录
继续。这里演示权限到字段和权限到记录。            权限到字段有两种安全级别,      1、低安全级别。有些项目不需要做到控制每一个字段是否显示,那么就可以采用这种级别。低安全级别就是:如果一个节点里面没有设置可以访问哪些字段,那么就默认为不需要做到控制字段的程度,就是说节点里的字段都是可以访问的。
1213 0
|
数据安全/隐私保护
【自然框架】之通用权限的Demo(一):角色的添加和修改
      非常抱歉,我是一个靠激情来工作的人,有心情做什么多快,没心情的时候什么都不爱做。最近很烦,所以速度也很慢。原本打算周一拿出来Demo的,结果延迟了现在。希望大家多多包含。这个Demo并不完整,目前权限方面只实现了角色的添加和修改,其他的还没有实现。
1022 0
【自然框架】之通用权限(七):权限到按钮
      继续,这是第七章了。我已经到了无话可说的地步了。哎,在坚持几章就结束了。第七章到第十章,我打算采用简单说明的方式来做,因为我感觉我这么写好像大家都不打感兴趣,或者说都比较忙,没有时间细看,或者说我写的太乱了,看不明白。
860 0
|
SQL 数据库 数据安全/隐私保护
通用权限相关文档的下载【2009.9.7更新】
最新的下载地址:http://www.naturefw.com/nature/down.aspx      下面的地址都作废。           您可以在这里下载通用权限相关的文档、源代码、Demo等,当然现在只有一个数据的说明文档。
744 0
|
SQL 数据库
【自然框架】之通用权限(六):权限到节点
      “直率没有错,但是也要考虑对方的承受能力呀!对方都承受不了了,你还直率,那就是你的错了!”  ——我的名言,呵呵。     ====================我就是传说中的,可爱的、无奈的、笑笑而过的分割线====================         继续,这是第六章了。
961 0
|
API Android开发 开发者
一个动态权限库的设计
在经过上一次尝试剖析源码后,我意识到自己并没有一种比较好的方式去讲解代码,从而无法把自己所知道的知识更好地输出。所以接下来,至少在源码讲解有新想法前,我都不会再去尝试,也尽量减少博客中的非核心代码,而以思路及想法为主。
1319 0