文档访问权限设计

简介:
前言:权限设计是一个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
相关文章
|
5月前
|
项目管理 数据安全/隐私保护
项目管理工具权限设置:如何自定义与控制访问
项目管理工具指南关注自定义和用户权限控制。工具提供自定义字段、状态、标志及用户权限简档和角色功能,允许团队根据需求调整,确保安全性和访问相关性。权限简档是一组权限设置,定义用户对系统的访问权限,可分配给多个用户。通过定制角色和权限,项目经理能精细控制团队成员的访问范围。例如,不同角色如管理员、产品经理和测试人员有不同的权限设定。此外,工具还支持@提及角色、跨项目依赖和任务编号等功能,如Zoho Projects提供的4级权限设置,实现精细化管理。
51 4
|
Java 数据安全/隐私保护 Spring
【自己设计权限控制】【网站的权限控制】【限制用户访问级别高的接口】
【自己设计权限控制】【网站的权限控制】【限制用户访问级别高的接口】
|
Rust JavaScript 前端开发
组织管理|路径表示|访问权限
组织管理|路径表示|访问权限
91 0
组织管理|路径表示|访问权限
|
JSON 测试技术 数据格式
[单账户]标签规范工具(标签策略)使用手册
企业随着上云的深入,对于资源管理的诉求越来越强烈。资源被企业各个子公司、部门等使用的时候,存在资源自产自用,一产复用,共产共用的情况。企业发展最初阶段,满足快速发展的诉求,资源自己生产自己使用。当企业发展到一定阶段,存在资源生产多处复用的情况,以满足业务细分发展。再到资源管理统一生产规划、根据场景复用资源的情况。标签化管理资源共产共用的基础,根据用途、场景、归属进行资源分类。如何把资源标签使用规范就是资源分类的前提。
1069 0
|
数据安全/隐私保护
|
数据库
【自然框架】之通用权限(九):权限的验证
继续,这是第九章了。本来这张应该好好写的,不过还是先简单介绍一下吧,以后有空再补上详细说明吧。 通用权限想要写的文章目录:(这是第九章)   1、 简介、数据库的总体结构2、 介绍人员表组3、 介绍组织结构表组4、 介绍角色表组5、 介绍“项目自我描述表组”6、 权限到节点7、 权限到...
787 0
【自然框架】之通用权限(七):权限到按钮
      继续,这是第七章了。我已经到了无话可说的地步了。哎,在坚持几章就结束了。第七章到第十章,我打算采用简单说明的方式来做,因为我感觉我这么写好像大家都不打感兴趣,或者说都比较忙,没有时间细看,或者说我写的太乱了,看不明白。
880 0
|
Web App开发
【自然框架】通用权限的视频演示(一):添加角色,权限到功能节点和按钮
写了几个关于权限的东东,好像大家都不大理解,也不太清楚我的权限到底能做什么,所以想来想去还是弄点视频吧,就是屏幕录像,这样大家看起来就方便了吧。      为了大家便于观看视频,我先说一下视频的步骤。
1178 0
|
数据安全/隐私保护
【自然框架】之通用权限的Demo(一):角色的添加和修改
      非常抱歉,我是一个靠激情来工作的人,有心情做什么多快,没心情的时候什么都不爱做。最近很烦,所以速度也很慢。原本打算周一拿出来Demo的,结果延迟了现在。希望大家多多包含。这个Demo并不完整,目前权限方面只实现了角色的添加和修改,其他的还没有实现。
1047 0