`
sumongh
  • 浏览: 226378 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

基于角色的权限设计

阅读更多

在任何系统中,权限设计是最基础的东西,本文给出一个基于角色的权限设计的循序渐进的设计方案。 <o:p></o:p>

  在权限系统中,功能(权限)是最小的单位,比如起草新闻、编辑新闻、审核新闻、删除新闻等,而角色是一类功能的集合,比如新闻编辑这个角色,他可能有起草新闻、编辑新闻等功能集合,而责任编辑他可能就有更多的权限,比如除了新闻编辑的功能,还有审核新闻、删除新闻等功能,给张三赋予新闻编辑的角色(其实我更愿意说把张三加入到新闻编辑这个角色中去),张三就可以起草新闻、编辑新闻了,给李四赋予责任编辑的角色,李四就可以起草新闻、编辑新闻、审核新闻、删除新闻了。 <o:p></o:p>

  我们来看看版本一的解决方案:

<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 286.5pt; HEIGHT: 278.25pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://cnblogs.com/images/cnblogs_com/tubo/Role%20Version1.jpg" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg"></v:imagedata></v:shape>
  <o:p></o:p>

  我们来模拟一下上面的数据: <o:p></o:p>

  用户信息表: <o:p></o:p>

UserID <o:p></o:p>

UserName <o:p></o:p>

U1 <o:p></o:p>

张三 <o:p></o:p>

U2 <o:p></o:p>

李四 <o:p></o:p>

  角色表: <o:p></o:p>

RoleID <o:p></o:p>

RoleName <o:p></o:p>

R1 <o:p></o:p>

新闻编辑 <o:p></o:p>

R2 <o:p></o:p>

责任编辑 <o:p></o:p>

  角色用户表: <o:p></o:p>

RoleID <o:p></o:p>

UserID <o:p></o:p>

R1 <o:p></o:p>

U1 <o:p></o:p>

R2 <o:p></o:p>

U2 <o:p></o:p>

  功能表: <o:p></o:p>

FunctionID <o:p></o:p>

FunctionName <o:p></o:p>

F1 <o:p></o:p>

起草新闻 <o:p></o:p>

F2 <o:p></o:p>

编辑新闻 <o:p></o:p>

F3 <o:p></o:p>

审核新闻 <o:p></o:p>

F4 <o:p></o:p>

删除新闻 <o:p></o:p>

  角色功能表: <o:p></o:p>

RoleID <o:p></o:p>

FunctionID <o:p></o:p>

R1 <o:p></o:p>

F1 <o:p></o:p>

R1 <o:p></o:p>

F2 <o:p></o:p>

R2 <o:p></o:p>

F1 <o:p></o:p>

R2 <o:p></o:p>

F2 <o:p></o:p>

R2 <o:p></o:p>

F3 <o:p></o:p>

R2 <o:p></o:p>

F4 <o:p></o:p>

  我们来看看如何判断一个用户具有某个功能权限: <o:p></o:p>

  首先在用户张三登录的时候,获取张三的全部功能列表: <o:p></o:p>

Select FunctionID From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="’">1’</st1:chmetcnv>) <o:p></o:p>

  这样就可以得到张三的全部功能列表Functions,在起草新闻的页面我们就可以做如下判断: <o:p></o:p>

Functions.Contain(‘F<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="’">1’</st1:chmetcnv>);//当然你可以把这个’F<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="’">1’</st1:chmetcnv>定义成一个常量:NewsFunction.Draft <o:p></o:p>

  如果为true就说明张三有起草新闻的权限。 <o:p></o:p>

  当然对于web应用,您可以把Functions session保存起来,以避免每打开一个页面都去数据库中获取。 <o:p></o:p>

  似乎看起来是一个不错的解决方案。 <o:p></o:p>

  还是新闻系统,最初新闻系统没有分类,但是随着新闻的增加,没有分类的新闻看起来总是乱的,于是张三和李四给新闻添加了分类A、分类B,还是由张三负责起草,李四负责审核,以后又添加了更多的分类,并且也增加了人手,这个时候就有新的要求出来了:希望张三只负责分类A的起草,分类B的起草交给其他人做,李四呢也只负责分类A的审核(就相当于是一个栏目的责任编辑)。 <o:p></o:p>

 <o:p></o:p>

权限设计(二) <o:p></o:p>

样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的)。 <o:p></o:p>

其实比新闻更好的例子是论坛板块的版主。 <o:p></o:p>

下面是版本二的解决方案: <o:p></o:p>

<v:shape id="_x0000_i1026" style="WIDTH: 291.75pt; HEIGHT: 310.5pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://tubo.cnblogs.com/images/cnblogs_com/tubo/Role%20Version2.jpg" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.jpg"></v:imagedata></v:shape>
在版本二的功能表中加入了一个ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类AResourceType为:NTA,分类B为:NTB): <o:p></o:p>

功能表: <o:p></o:p>

FunctionID <o:p></o:p>

ResourceType <o:p></o:p>

FunctionName <o:p></o:p>

F1 <o:p></o:p>

NTA <o:p></o:p>

起草新闻:分类A <o:p></o:p>

F2 <o:p></o:p>

NTA <o:p></o:p>

编辑新闻:分类A <o:p></o:p>

F3 <o:p></o:p>

NTA <o:p></o:p>

审核新闻:分类A <o:p></o:p>

F4 <o:p></o:p>

NTA <o:p></o:p>

删除新闻:分类A <o:p></o:p>

F1 <o:p></o:p>

NTB <o:p></o:p>

起草新闻:分类B <o:p></o:p>

F2 <o:p></o:p>

NTB <o:p></o:p>

编辑新闻:分类B <o:p></o:p>

F3 <o:p></o:p>

NTB <o:p></o:p>

审核新闻:分类B <o:p></o:p>

F4 <o:p></o:p>

NTB <o:p></o:p>

删除新闻:分类B <o:p></o:p>

然后在角色表添加相应的角色,在角色功能表中添加对应的功能。 <o:p></o:p>

获取Functions的语句也相应地做变化: <o:p></o:p>

Select FunctionID  + ‘’ + ResourceType From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="’">1’</st1:chmetcnv>) <o:p></o:p>

权限的判断也就变成: <o:p></o:p>

Functions.Contain(‘F1,NTA’); <o:p></o:p>

在新添加一个分类的时候,同时也在功能表中增加相应的记录(当然不是在数据库里面直接添加,由和功能相关的函数来添加)。 <o:p></o:p>

使用这种解决方案可以简单地对有分类的应用(比如论坛系统)的每个分类实行不同的控制(比如VIP板块,就只能拥有VIP角色的用户才能浏览、发表等,而其他板块只要是注册用户就可以使用了)。 <o:p></o:p>

在实际应用中FunctionID并不是随便的一个字符串,而是进行了编码,其编码中包含了模块ID以及能够体现出父子关系,举个例子来说:对于论坛系统,我们给它一个模块ID”<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="30" unitname="”">30”</st1:chmetcnv>,论坛的功能我们先分成2类,一类是管理类(比如删除帖子),一类是使用类(比如发帖、回帖、浏览帖子等),给管理类一个编码:01,使用类一个编码:02,我们就对FunctionID进行如下的编码: <o:p></o:p>

300101:删除帖子 <o:p></o:p>

300201:发帖 <o:p></o:p>

300202:回帖 <o:p></o:p>

300203:浏览帖子 <o:p></o:p>

对于资源(比如某个板块1,板块的ID为:01),我们可以组合出如下的Functions(当然这个组合你也可以不用逗号分隔,用其他的组合方式也可以,不过不要产生歧义): <o:p></o:p>

300101,01:板块1删除帖子的功能 <o:p></o:p>

分享到:
评论

相关推荐

    基于角色的权限管理数据库设计

    ### 基于角色的权限管理数据库设计 #### 概述 本文档主要介绍了一种基于角色的权限管理系统(RBAC)的数据库设计方案,并通过具体的SQL脚本实现了该方案的基本功能。RBAC(Role-Based Access Control)是一种常用的...

    基于角色的用户权限系统设计

    ### 基于角色的用户权限系统设计 随着信息技术的广泛应用,“信息安全”问题变得日益突出。为了确保系统安全,根据OSI(开放式系统互联)模型,提出了五项基本安全服务:身份验证、访问控制、数据完整性、数据机密...

    基于角色权限管理PDM图

    标题中的“基于角色权限管理PDM图”指的是在软件开发中使用的一种设计模式,即“基于角色的权限控制”(Role-Based Access Control, RBAC)。PDM是“产品数据管理”(Product Data Management)的缩写,通常用于管理...

    基于角色的权限控制

    在IT行业中,基于角色的权限控制(Role-Based Access Control,简称RBAC)是一种常见的权限管理系统设计模式,用于高效、安全地管理用户访问权限。本文将深入探讨RBAC模型的原理、核心概念以及如何实现。 首先,...

    基于角色的权限控制设计

    基于角色的权限控制(Role-Based Access Control,简称RBAC)是一种有效的访问控制策略,它将权限与角色关联,用户通过角色获取相应的权限。在大型系统中,这种模型能够有效地简化权限管理和分配,尤其是在用户数量...

    基于角色的Web应用系统权限设计

    在本文中,我们将探讨如何在ASP.NET环境中,利用用户控件技术实现基于角色的Web应用系统权限设计。 首先,我们需要理解RBAC的核心概念。RBAC模型主要包括三个基本元素:用户(User)、角色(Role)和权限...

    Asp.net中的用户角色权限设计

    在Asp.net开发中,用户角色权限设计是构建安全、高效Web应用的关键组成部分。这一设计模式使得系统能够根据用户的不同身份和职责分配不同的操作权限,从而保护数据安全,提高用户体验。下面将详细探讨Asp.net中实现...

    基于角色的权限管理

    基于角色的权限管理,能否独立出来的设计和讨论

    基于角色权限管理模型的设计与实现

    分析了基于角色访问控制模型的原理,将该模型引入企业信息系统的权限管理,研究了基于角色 的权限分配策略。为实现权限分配策略,本文提出了一种符合企业管理结构的权限管理实施方案,并 给出了系统关键技术的具体...

    基于角色的权限管理系统视频教程

    很多初学者面对这样的需求不知道如何下手,特别是稍微复杂点的权限,更是找不到方向,为此我们夜鹰教程网特别推出了这套基于角色的权限管理视频教程,通过给用户分配角色,给角色分配权限,来实现权限管理。...

    基于角色的权限系统

    基于角色的权限系统是软件开发中的一个重要概念,它主要用于实现对用户访问资源的精细控制。在这样的系统中,权限不再直接赋予用户,而是通过角色这一中间层进行间接管理。用户被分配到不同的角色,每个角色拥有特定...

    delphi基于角色的权限控制.pdf

    ### Delphi 基于角色的权限控制系统设计与实现 #### 一、系统设计概述 在现代软件开发中,特别是企业级应用系统中,权限管理是非常重要的组成部分之一。权限管理系统不仅可以帮助管理员有效地控制用户访问资源的...

    RBAC用户角色权限设计方案

    ### RBAC用户角色权限设计方案详解 #### 一、引言 在现代软件系统尤其是企业级应用中,用户角色权限管理是非常重要的一部分。合理的权限管理不仅可以提高系统的安全性,还能提升用户体验,使得不同用户能够根据自己...

    C# WinForm实现基于角色权限的菜单

    在C# WinForm应用开发中,构建一个基于角色权限的菜单是常见的需求,尤其是在企业级应用中,确保不同用户群体只能访问他们被授权的操作。这个项目利用Visual Studio 2008或更高版本来实现这样的功能,展示了如何将...

    角色权限表设计

    角色权限表设计 本文阐述了设计一个灵活、通用、方便的权限管理系统的思路和方法。权限管理系统是应用系统不可缺少的一个部分,对系统的所有资源进行权限控制是非常重要的。系统的目标是对应用系统的所有对象资源和...

    C# WinForm角色的权限菜单-源码.zip

    角色权限设计是一种常见的访问控制策略,它将权限与角色关联,而不是直接与用户关联。这样,当一个用户被分配到某个角色时,他自动获得了该角色所包含的所有权限。这种设计简化了权限管理,因为只需修改角色的权限...

    SSH+Extjs4 0实现的权限管理系统 基于角色的权限设计

    【SSH+Extjs4.0 实现的权限管理系统 基于角色的权限设计】 SSH(Spring、Struts2、Hibernate)是一个常见的Java Web开发框架,用于构建高效、可维护的Web应用程序。在这个项目中,SSH框架被用来处理后端业务逻辑、...

Global site tag (gtag.js) - Google Analytics