ASP.NET网站权限设计实现(二)——角色权限绑定

原创 2011年01月21日 22:06:00

 

上一篇:ASP.NET网站权限设计实现(一)——使用PowerDesigner进行数据库设计

 

1、关于使用的几张表的说明

(1)Module:模块表,记录模块名称、编码等模块基本数据。 
(2)Permissions:权限表,记录所有模块权限distinct之后的数据。

 

(3)ModulePermissions:模块权限,记录每个模块对应的权限,一个模块可能存在多条数据,每条表示该模块的一个操作权限。

 

(4)Roles:角色表,记录角色名称、编码等角色基本数据。

 

(5)RolePermissions:角色权限表,记录每个角色对应的权限,一个角色可能存在多条数据,每条数据表示该角色在某个模块的一个操作权限;表中的数据其实记录的是角色编码跟ModulePermissions表中的主键对应,表ModulePermissions中特定主键的数据行就表示了某个模块的一个操作权限。

 

(6)SUser:用户表,记录用户名等用户基本信息。

 

(7)UserRole:用户角色表,记录每个用户对应的角色,可以是多个,但本例只设置对应一个,只要用户具有了某个角色,那么该用户就具有了和角色一样的权限。

 

2、关于PowerDesigher :上一篇介绍了初次在数据库生成表的过程,实际上还可以实现更新和逆向操作(根据数据库中的表在PD中生成表模型)。

 

3、模拟数据

(1)表Module

 

(2)表Permissions 

 

(3)表ModulePermissions 

 

 

4、角色分页显示和删除

这里实现功能的代码基本都是最初级的代码,后面另一个版本会在架构、UI、代码等方面进行较大的改进;另外这里的代码纯粹是演示,不会考虑注入、异常等方面的处理。

 

(1)分页显示数据直接使用GridView了 

 

 

(2)在列表页面可以全选本页数据一次性删除,全选/全取消使用JQuery实现,选中时将值(这里是角色编码)保存在一个隐藏域中,隐藏域中的值的格式:'值1','值2',...(数据库中的RoleCode列的数据类型是nvarchar);取消选中时将隐藏域中的值清空;单行CheckBox选中/取消时,将当前行的值追加到隐藏域的值或从隐藏域的值中移除当前行的值 。删除时先判断隐藏域的值是否为空,如果为空提示”选中数据“,如果不为空提示”确定删除吗?“,确认删除后,根据隐藏域中的值构造delete语句(使用in子句)将数据删除。

 

 

 

(3)代码

Index.aspx

说明: 

$("#txtKeys") :JQuery得到ID为txtKeys的元素

$("#txtKeys").val() ;:获得ID为txtKeys的元素的值

$("#txtKeys").val("");:设置ID为txtKeys的元素的值,这里是空字符串

$(":checkbox").each(function () { });:遍历当前文档中CheckBox类型的元素,并在function中进行处理

$(this).attr("checked");:获得当前遍历到的CheckBox的checked属性的值

$(this).attr("checked", $("#cbAll").attr("checked"));:设置当前CheckBox的选中状态跟“全选”CheckBox一样,实际上就是通过这种方式给当前CheckBox的checked属性

注意所有CheckBox都有客户端onclick事件,触发时会调用不同JavaScript函数执行 

用到的Web服务器控件:TextBox 、Button、HiddenField、GridView、HyperLink、LinkButton

 

Index.aspx.cs 

 

说明:

SqlHelper:是数据访问类,包含一些方法提供对数据库的访问和操作 

ExecuteNonQueryWithTran:调用SqlCommand的ExecuteNonQuery方法执行insert、update、delete语句,添加了事务处理

 

5、角色新增和修改

(1)新建角色

 这儿的关键是绑定权限、全选或全取消及获取选中项的值、构造insert语句,先看一下页面运行后的结果 

 

(1.1)绑定权限 

使用两个GridView嵌套,最外面的(gvParent)显示顶级模块名称;嵌套在内的(gvChild)在gvParent的RowDataBound中进行数据绑定以显示二级模块名称(根据gvParent当前行的模块编码Moudle表中查询数据; 在gvChild的RowDataBound中绑定权限复选框列表,数据根据gvChild当前行的模块编码从下面视图(V_ModulePermissions)中查询,这里的复选框用的是<input type="checkbox" />,首先跟权限的数量构造CheckBox的html代码字符串,然后用Label显示出来,由于Label在客户端生成的代码中将变为所有这些CheckBox的父元素,所以也方便将来实现单模块的全选或者全取消,具体内容看后面代码。

视图V_ModulePermissions:

 

SQL:

SELECT     dbo.Permissions.PermissionName, dbo.ModulePermissions.ModuleCode, dbo.ModulePermissions.PermissionCode, dbo.ModulePermissions.ID
FROM         dbo.ModulePermissions INNER JOIN
                      dbo.Permissions ON dbo.ModulePermissions.PermissionCode = dbo.Permissions.PermissionCode INNER JOIN
                      dbo.Module ON dbo.ModulePermissions.ModuleCode = dbo.Module.ModuleCode
WHERE     (dbo.Module.ModuleVisible = 1) AND (dbo.Permissions.PermissionVisible = 1)

 

 (1.2)全选或全取消及获取选中项的值

每一个CheckBox的Click事件触发时都会调用一个JavaScript函数执行,这些函数不仅是完成选中或者取消选中,还要完成获得并追加或移除相应的CheckBox的值,最终构造的字符串是这种格式:,1,,2,,3,,4,...,并存储在隐藏域中。代码后面附上 。

 

(1.3)构造insert语句 

获取隐藏域的值进行字符串替换和拆分,遍历拆分出来的数据,构造insert语句,最后执行。 

 

(2)修改角色

 关键是设置当前角色已有权限项选中,先看页面结果

 

 

这里的处理是根据URL参数RoleCode的值从视图V_RolePermissions查询该角色的所有权限,然后构造一个字符串,在构造<input type="checkbox" />时判断该字符串是否包含此权限的标识,如果包含,就添加 checked属性。

 

SQL:

SELECT     dbo.V_ModulePermissions.ID, dbo.RolePermissions.RoleCode
FROM         dbo.V_ModulePermissions INNER JOIN
                      dbo.RolePermissions 
ON dbo.V_ModulePermissions.ID = dbo.RolePermissions.ModulePermissionID

 

(3)新建、修改全部代码

Edit.aspx

  

Edit.aspx.cs 

 

 

(4)操作成功后的提示及页面跳转

 

 

Redirect.html

使用setInterval函数倒计时 

获取传递过来的路径(传递的是相对路径),倒计时到0秒时,使用window.clearInterval(intervalId)清除setInterval事件,并指定window.location.href=路径,使得由当前页跳转到目的页

 

 

OK,到此全部完成,感觉说的太多了,所以有些内容没介绍,看代码吧。 

 

基于角色的权限设计(一)

在任何系统中,权限设计是最基础的东西,本文给出一个基于角色的权限设计的循序渐进的设计方案。   在权限系统中,功能(权限)是最小的单位,比如起草新闻、编辑新闻、审核新闻、删除新闻等,而角色是一类功能...
  • snomyc
  • snomyc
  • 2014年08月19日 10:02
  • 8340

Java Web角色权限设计

web系统用户角色权限设计,角色菜单,角色功能,根据角色查询其菜单资源,菜单功能。...
  • u012750578
  • u012750578
  • 2014年02月08日 22:54
  • 9211

一张图理解用户、角色、权限设计,终极版~

  • u010105972
  • u010105972
  • 2017年09月13日 22:28
  • 174

常见模块设计--权限管理(一)

1.基于 RBAC(Role-based Access Control)权限访问控制。也就是说一个用户可以有多个角色,一个角色可以有多个权限,通过将角色和权限分离开来提高设计的可扩展性,通常一个用户有...
  • sunyanxiong123
  • sunyanxiong123
  • 2017年05月31日 23:29
  • 623

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

最近项目中需要设计一个权限系统,收集了一下资料,权限系统主要有两种技术:ACL(Access Control List)和RBAC(Role-Based Access Control)。前者是将用户直...
  • forebeacher
  • forebeacher
  • 2011年07月13日 11:53
  • 3711

基于角色的权限设计(通用RBAC权限设计)

基于角色的权限设计
  • hardworking0323
  • hardworking0323
  • 2016年04月11日 21:19
  • 560

大型门户网站的RBAC用户权限管理设计

这是我在网上找的一些设计比较好的RBAC权限管理 不知道,像新浪、搜狐、网易、百度、阿里巴巴、淘宝网的RBAC用户权限这一块,都是这种细颗粒的RBAC设计开发,还是把他们像用户组、角色组、权限组...
  • rocher88
  • rocher88
  • 2015年01月27日 09:15
  • 3629

ASP.NET MVC程序权限控制解决方案(一)

1.  什么是权限?? l  权限跟用户登录是没有任何关系的,但是要用到用户的数据,权限就是在请求我们系统的一个服务(请求地址,请求方法,请求Action,请求WebService等)的时候,当在请...
  • yiwuxun
  • yiwuxun
  • 2014年10月29日 22:17
  • 2207

权限码设计的想法(类linux)

Imaging系统的权限控制:只能将功能给与岗位,然后把某个员工放到岗位上去。也就是说,员工要么有某个岗位的所有功能,要么一个都没有。这个明显不合理。应该可以为某一个员工增加所在岗位之外任意的一个独立...
  • TangFeng2012
  • TangFeng2012
  • 2012年10月29日 18:44
  • 857

关于用户角色权限的设计

一直想整理一篇关于用户角色权限的设计,这几天通过网上资料和自己实际工作中运用到的资源把用户角色权限的数据库表设计出来。 基础表有3张: 角色表--用来记录角色名称 用户表--用来记录登录用户名称...
  • u010192842
  • u010192842
  • 2014年01月07日 15:59
  • 2678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET网站权限设计实现(二)——角色权限绑定
举报原因:
原因补充:

(最多只允许输入30个字)