权限设计
在任何系统中,权限设计是最基础的东西,本文给出一个基于角色的权限设计的循序渐进的设计方案。
在权限系统中,功能(权限)是最小的单位,比如起草新闻、编辑新闻、审核新闻、删除新闻等,而角色是一类功能的集合,比如新闻编辑这个角色,他可能有起草新闻、编辑新闻等功能集合,而责任编辑他可能就有更多的权限,比如除了新闻编辑的功能,还有审核新闻、删除新闻等功能,给张三赋予新闻编辑的角色(其实我更愿意说把张三加入到新闻编辑这个角色中去),张三就可以起草新闻、编辑新闻了,给李四赋予责任编辑的角色,李四就可以起草新闻、编辑新闻、审核新闻、删除新闻了。
我们来看看版本一的解决方案:
我们来模拟一下上面的数据:
用户信息表:
UserID |
UserName |
U1 |
张三 |
U2 |
李四 |
角色表:
RoleID |
RoleName |
R1 |
新闻编辑 |
R2 |
责任编辑 |
角色用户表:
RoleID |
UserID |
R1 |
U1 |
R2 |
U2 |
功能表:
FunctionID |
FunctionName |
F1 |
起草新闻 |
F2 |
编辑新闻 |
F3 |
审核新闻 |
F4 |
删除新闻 |
角色功能表:
RoleID |
FunctionID |
R1 |
F1 |
R1 |
F2 |
R2 |
F1 |
R2 |
F2 |
R2 |
F3 |
R2 |
F4 |
我们来看看如何判断一个用户具有某个功能权限:
首先在用户张三登录的时候,获取张三的全部功能列表:
Select FunctionID From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)
这样就可以得到张三的全部功能列表Functions,在起草新闻的页面我们就可以做如下判断:
Functions.Contain(‘F1’);//当然你可以把这个’F1’定义成一个常量:NewsFunction.Draft
如果为true就说明张三有起草新闻的权限。
当然对于web应用,您可以把Functions 用session保存起来,以避免每打开一个页面都去数据库中获取。
似乎看起来是一个不错的解决方案。
还是新闻系统,最初新闻系统没有分类,但是随着新闻的增加,没有分类的新闻看起来总是乱的,于是张三和李四给新闻添加了分类A、分类B,还是由张三负责起草,李四负责审核,以后又添加了更多的分类,并且也增加了人手,这个时候就有新的要求出来了:希望张三只负责分类A的起草,分类B的起草交给其他人做,李四呢也只负责分类A的审核(就相当于是一个栏目的责任编辑)。
针对这样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的)。
其实比新闻更好的例子是论坛板块的版主。
下面是版本二的解决方案:
在版本二的功能表中加入了一个ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类A的ResourceType为:NTA,分类B为:NTB):
功能表:
FunctionID |
ResourceType |
FunctionName |
F1 |
NTA |
起草新闻:分类A |
F2 |
NTA |
编辑新闻:分类A |
F3 |
NTA |
审核新闻:分类A |
F4 |
NTA |
删除新闻:分类A |
F1 |
NTB |
起草新闻:分类B |
F2 |
NTB |
编辑新闻:分类B |
F3 |
NTB |
审核新闻:分类B |
F4 |
NTB |
删除新闻:分类B |
然后在角色表添加相应的角色,在角色功能表中添加对应的功能。
获取Functions的语句也相应地做变化:
Select FunctionID + ‘,’ + ResourceType From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)
权限的判断也就变成:
Functions.Contain(‘F1,NTA’);
在新添加一个分类的时候,同时也在功能表中增加相应的记录(当然不是在数据库里面直接添加,由和功能相关的函数来添加)。
使用这种解决方案可以简单地对有分类的应用(比如论坛系统)的每个分类实行不同的控制(比如VIP板块,就只能拥有VIP角色的用户才能浏览、发表等,而其他板块只要是注册用户就可以使用了)。
在实际应用中FunctionID并不是随便的一个字符串,而是进行了编码,其编码中包含了模块ID以及能够体现出父子关系,举个例子来说:对于论坛系统,我们给它一个模块ID为”30”,论坛的功能我们先分成2类,一类是管理类(比如删除帖子),一类是使用类(比如发帖、回帖、浏览帖子等),给管理类一个编码:01,使用类一个编码:02,我们就对FunctionID进行如下的编码:
300101:删除帖子
300201:发帖
300202:回帖
300203:浏览帖子
对于资源(比如某个板块1,板块的ID为:01),我们可以组合出如下的Functions(当然这个组合你也可以不用逗号分隔,用其他的组合方式也可以,不过不要产生歧义):
300101,01:板块1删除帖子的功能
300201,01:板块1发帖的功能
……
对于RoleID也是采用的编码方式,也能体现角色的父子关系,也可以实现角色功能的继承等(当然获取角色功能列表的SQL语句就不是现在这么简单了)。在我现在的应用里面没有实现角色的继承(虽然角色的编码体现出了角色的父子关系)。
针对这样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的)。
其实比新闻更好的例子是论坛板块的版主。
下面是版本二的解决方案:
在版本二的功能表中加入了一个ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类A的ResourceType为:NTA,分类B为:NTB):
功能表:
FunctionID |
ResourceType |
FunctionName |
F1 |
NTA |
起草新闻:分类A |
F2 |
NTA |
编辑新闻:分类A |
F3 |
NTA |
审核新闻:分类A |
F4 |
NTA |
删除新闻:分类A |
F1 |
NTB |
起草新闻:分类B |
F2 |
NTB |
编辑新闻:分类B |
F3 |
NTB |
审核新闻:分类B |
F4 |
NTB |
删除新闻:分类B |
然后在角色表添加相应的角色,在角色功能表中添加对应的功能。
获取Functions的语句也相应地做变化:
Select FunctionID + ‘,’ + ResourceType From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)
权限的判断也就变成:
Functions.Contain(‘F1,NTA’);
在新添加一个分类的时候,同时也在功能表中增加相应的记录(当然不是在数据库里面直接添加,由和功能相关的函数来添加)。
使用这种解决方案可以简单地对有分类的应用(比如论坛系统)的每个分类实行不同的控制(比如VIP板块,就只能拥有VIP角色的用户才能浏览、发表等,而其他板块只要是注册用户就可以使用了)。
在实际应用中FunctionID并不是随便的一个字符串,而是进行了编码,其编码中包含了模块ID以及能够体现出父子关系,举个例子来说:对于论坛系统,我们给它一个模块ID为”30”,论坛的功能我们先分成2类,一类是管理类(比如删除帖子),一类是使用类(比如发帖、回帖、浏览帖子等),给管理类一个编码:01,使用类一个编码:02,我们就对FunctionID进行如下的编码:
300101:删除帖子
300201:发帖
300202:回帖
300203:浏览帖子
对于资源(比如某个板块1,板块的ID为:01),我们可以组合出如下的Functions(当然这个组合你也可以不用逗号分隔,用其他的组合方式也可以,不过不要产生歧义):
300101,01:板块1删除帖子的功能
300201,01:板块1发帖的功能
……
对于RoleID也是采用的编码方式,也能体现角色的父子关系,也可以实现角色功能的继承等(当然获取角色功能列表的SQL语句就不是现在这么简单了)。在我现在的应用里面没有实现角色的继承(虽然角色的编码体现出了角色的父子关系)。
我们来模拟一下上面的数据:
用户信息表:
UserID |
UserName |
U1 |
张三 |
U2 |
李四 |
角色表:
RoleID |
RoleName |
R1 |
新闻编辑 |
R2 |
责任编辑 |
角色用户表:
RoleID |
UserID |
R1 |
U1 |
R2 |
U2 |
功能表:
FunctionID |
FunctionName |
F1 |
起草新闻 |
F2 |
编辑新闻 |
F3 |
审核新闻 |
F4 |
删除新闻 |
角色功能表:
RoleID |
FunctionID |
R1 |
F1 |
R1 |
F2 |
R2 |
F1 |
R2 |
F2 |
R2 |
F3 |
R2 |
F4 |
我们来看看如何判断一个用户具有某个功能权限:
首先在用户张三登录的时候,获取张三的全部功能列表:
Select FunctionID From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)
这样就可以得到张三的全部功能列表Functions,在起草新闻的页面我们就可以做如下判断:
Functions.Contain(‘F1’);//当然你可以把这个’F1’定义成一个常量:NewsFunction.Draft
如果为true就说明张三有起草新闻的权限。
当然对于web应用,您可以把Functions 用session保存起来,以避免每打开一个页面都去数据库中获取。
似乎看起来是一个不错的解决方案。
还是新闻系统,最初新闻系统没有分类,但是随着新闻的增加,没有分类的新闻看起来总是乱的,于是张三和李四给新闻添加了分类A、分类B,还是由张三负责起草,李四负责审核,以后又添加了更多的分类,并且也增加了人手,这个时候就有新的要求出来了:希望张三只负责分类A的起草,分类B的起草交给其他人做,李四呢也只负责分类A的审核(就相当于是一个栏目的责任编辑)。
针对这样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的)。
其实比新闻更好的例子是论坛板块的版主。
下面是版本二的解决方案:
在版本二的功能表中加入了一个ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类A的ResourceType为:NTA,分类B为:NTB):
功能表:
FunctionID |
ResourceType |
FunctionName |
F1 |
NTA |
起草新闻:分类A |
F2 |
NTA |
编辑新闻:分类A |
F3 |
NTA |
审核新闻:分类A |
F4 |
NTA |
删除新闻:分类A |
F1 |
NTB |
起草新闻:分类B |
F2 |
NTB |
编辑新闻:分类B |
F3 |
NTB |
审核新闻:分类B |
F4 |
NTB |
删除新闻:分类B |
然后在角色表添加相应的角色,在角色功能表中添加对应的功能。
获取Functions的语句也相应地做变化:
Select FunctionID + ‘,’ + ResourceType From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)
权限的判断也就变成:
Functions.Contain(‘F1,NTA’);
在新添加一个分类的时候,同时也在功能表中增加相应的记录(当然不是在数据库里面直接添加,由和功能相关的函数来添加)。
使用这种解决方案可以简单地对有分类的应用(比如论坛系统)的每个分类实行不同的控制(比如VIP板块,就只能拥有VIP角色的用户才能浏览、发表等,而其他板块只要是注册用户就可以使用了)。
在实际应用中FunctionID并不是随便的一个字符串,而是进行了编码,其编码中包含了模块ID以及能够体现出父子关系,举个例子来说:对于论坛系统,我们给它一个模块ID为”30”,论坛的功能我们先分成2类,一类是管理类(比如删除帖子),一类是使用类(比如发帖、回帖、浏览帖子等),给管理类一个编码:01,使用类一个编码:02,我们就对FunctionID进行如下的编码:
300101:删除帖子
300201:发帖
300202:回帖
300203:浏览帖子
对于资源(比如某个板块1,板块的ID为:01),我们可以组合出如下的Functions(当然这个组合你也可以不用逗号分隔,用其他的组合方式也可以,不过不要产生歧义):
300101,01:板块1删除帖子的功能
300201,01:板块1发帖的功能
……
对于RoleID也是采用的编码方式,也能体现角色的父子关系,也可以实现角色功能的继承等(当然获取角色功能列表的SQL语句就不是现在这么简单了)。在我现在的应用里面没有实现角色的继承(虽然角色的编码体现出了角色的父子关系)。
针对这样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的)。
其实比新闻更好的例子是论坛板块的版主。
下面是版本二的解决方案:
在版本二的功能表中加入了一个ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类A的ResourceType为:NTA,分类B为:NTB):
功能表:
FunctionID |
ResourceType |
FunctionName |
F1 |
NTA |
起草新闻:分类A |
F2 |
NTA |
编辑新闻:分类A |
F3 |
NTA |
审核新闻:分类A |
F4 |
NTA |
删除新闻:分类A |
F1 |
NTB |
起草新闻:分类B |
F2 |
NTB |
编辑新闻:分类B |
F3 |
NTB |
审核新闻:分类B |
F4 |
NTB |
删除新闻:分类B |
然后在角色表添加相应的角色,在角色功能表中添加对应的功能。
获取Functions的语句也相应地做变化:
Select FunctionID + ‘,’ + ResourceType From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)
权限的判断也就变成:
Functions.Contain(‘F1,NTA’);
在新添加一个分类的时候,同时也在功能表中增加相应的记录(当然不是在数据库里面直接添加,由和功能相关的函数来添加)。
使用这种解决方案可以简单地对有分类的应用(比如论坛系统)的每个分类实行不同的控制(比如VIP板块,就只能拥有VIP角色的用户才能浏览、发表等,而其他板块只要是注册用户就可以使用了)。
在实际应用中FunctionID并不是随便的一个字符串,而是进行了编码,其编码中包含了模块ID以及能够体现出父子关系,举个例子来说:对于论坛系统,我们给它一个模块ID为”30”,论坛的功能我们先分成2类,一类是管理类(比如删除帖子),一类是使用类(比如发帖、回帖、浏览帖子等),给管理类一个编码:01,使用类一个编码:02,我们就对FunctionID进行如下的编码:
300101:删除帖子
300201:发帖
300202:回帖
300203:浏览帖子
对于资源(比如某个板块1,板块的ID为:01),我们可以组合出如下的Functions(当然这个组合你也可以不用逗号分隔,用其他的组合方式也可以,不过不要产生歧义):
300101,01:板块1删除帖子的功能
300201,01:板块1发帖的功能
……
对于RoleID也是采用的编码方式,也能体现角色的父子关系,也可以实现角色功能的继承等(当然获取角色功能列表的SQL语句就不是现在这么简单了)。在我现在的应用里面没有实现角色的继承(虽然角色的编码体现出了角色的父子关系)。
分享到:
相关推荐
通用权限管理概要设计说明书 通用权限管理概要设计说明书
The specific functions of the system include user management, administrator management, press release, news modification, search News, comments, and other functions. Key words:Java web;Mysql;...
The system mainly has user management, function management, role rights management, student network examination, test questions management, wrong title management, automatic test paper and other ...
四、视图,索引,数据库权限: create view temp (sno,sname,cname,score) as select info.sno,info.sname,course.cname,exam.score from info,exam,course where info.sno=exam.sno and exam.cno=course...
├─13权限、角色和架构 │ schema.sql │ Sql Server 2005中的架构(Schema)用户(User)角色(Role)和登录(Login).pdf │ ├─14 数据库备份与恢复 │ Backup.sql │ └─15 其它应用 other.sql SQL Server将数据...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...
如果您已经练习或设计了一个有趣的问题,我们很乐意见到它! 通过建议或优化来打开PR或问题。 问题 查看,或从此处开始: 排序算法 数据结构 不是实现,请检查有效的实现 DOM问题 最短代码问题 测验 npm install #...
Use Microsoft's VISUAL BASIC and sql, developed the school management system with relevant data query, add, delete and other functions, to achieve a systematic and standardized school management. ...
6.2.11 其它源事件格式(Event_Format_Other)实体 247 6.2.12 源事件格式(Event_Format)实体 248 6.2.13 源事件格式段(Event_Format_Segment)实体 249 6.2.14 源事件格式项(Event_Format_Item)实体 250 6.2.15 数据...
14.Other: Log4j,Velocity,Sitemesh,Jfreechart,Jforum,Solr 15.Maven 2 3.BPMX3的组件构建方式 BPMX3同时也是基于组件构构建,整个系统的构建如下所示: 【图三】BPMX3组件构建 系统提供在线流程设计器,...
有用户管理,报表权限的管理。 支持多语种。 软件环境: 客户端: Windows 2000及以上版本,Microsoft Office 2000及以上版本 服务器端:Windows和Linux都可以,jsdk1.4,tomcat5 数据库:...
(注 删除没有写权限的文件可以用 rm -f ,这是为了操作方便,是人性化的设计)。 x 执行权限;对目录,是进入该目录 - 表示没有权限 形式 - rw- r-- r-- 其中 第一个是文件类型(-表普通文件,d表目录,l表软...
重启完成之后 进入设置界面 选择other Setting 下的Sexy Editor , 右侧 insert 一张或多张图片即可,上面的其他设置可以设置方位 间隔时间 透明度等等,设置完成后,要关闭打开的文件,重新打开项目文件即可在代码...
知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以...
用户运行环境为标准的中文浏览器环境(比如,IE4.0或以上版本),用户只要具有一定的权限,并能通过浏览器访问服务器上的Web站点,就可以使用题库参加考试并以HTML格式呈现。为了整个系统的安全和维护的方便,在系统...
otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法访问本类成员 showMethod.java 演示如何定义一个方法体 showReturn_1.java return...
kermit在执行其它命令之前,会执行你的用户目录下的初始文件.kermrc,所以可以非常简单的通过初始化命令来定制kermit。下面是使用U-Boot和Linux时推荐配置: ~/.kermrc: set line /dev/ttyS0 set speed 115200 set ...
-测试设计。 -测试执行。 -测试记录和缺陷跟踪。 -回归测试。 -测试总结和报告。 一个好的测试管理工具应该能把以上几个阶段都管理起来。 测试人员每时每刻都在度量别人的工作成果,而测试人员的...