博客
关于我
关于级联(树形权限)的基本实现思路
阅读量:433 次
发布时间:2019-03-06

本文共 2368 字,大约阅读时间需要 7 分钟。

本文介绍Portal里实现级联权限的思路。其实windows 文件夹权限本身就是一个典型的级联权限,参考下图。

在windows文件夹权限里,在“安全‘里,有一项”包括可从改对象的父项集成的权限“。默认是选中的。

这样的好处是,假如我们有一个”人事部“文件夹,设置只有人事部的人员可以访问,我们可以在人事部里建立无限个子文件夹,这些文件夹默认也都是只能是人事部人员可以访问,不需要管理员单独赋予权限。

 

在我们Portal系统里,也采用了类似简化的权限设置

下面介绍实现方式:

 很显然,我们需要有一张权限表(tabsecurity存储每一个页面的具体记录,数据库结构如下)

下面显示了填充数据后的结果,

attribute取值为group或者user,表示节点是组或者用户属性,

name为组名或者用户名。

Roletype为0是只读,为1为可写,如果为2表示可以设计。

 

 

 

接下来,还需要设计tab表,他记录页面权限是否是继承的--inherit字段,

这里inherit并没有放置到tabsecurity表里,我们仅把权限当做页面的一个属性。

如果是1表示自动继承父权限,为0表示非继承。

 

 

有了上面的结构,即可在用户访问页面时,获取其权限,下面就是实现这个功能核心的SQL语句。

 

当用户访问页面时,会建立一个临时表#a, 其中 while @parentid>0 and @inherit>0 表示如果如果当前节点是支持继承的,而且他还有父节点 就继续循环父节点的权限,然后给此节点 系统执行完毕后,会得到当前节点实际权限列表

 

public static DataView GetTabSecurityRolesTree(int tabid, string sectype)         {             string sql = @"       declare @parentid int        declare @id int       declare @inherit int             if object_id('tempdb..#a') is not null        Begin              drop table #a       End          create table #a(id int, parentid int)       set @id="+tabid+ @"       select @parentid=parentid, @id=id ,@inherit=inherit  from portal_pages where id=@id        insert into #a(id,parentid) values(@id,@id)  while @parentid>0 and @inherit>0  begin select @parentid=parentid, @id=id, @inherit=inherit from portal_pages where id=@parentid  insert into #a(id,parentid) values(@id,@parentid)  set @id=@parentid  end                     select * from  portal_tabsecurity inner join #a  on #a.id=tabid     ";                          DataView dv = new DataView( DBHelper.Instance.ExeDataSet(sql).Tables[0] );             dv.RowFilter = " sectype='" + sectype + "' ";             return dv;         }

 

有上面得到页面的权限,然后在获取当前用户已有的权限,一比较,就能够确认用户是否可以访问

 

然后检查他是否有权限。      private bool CheckAuthenticatedPermission(string[] PageRoles, string[] myroles)     {         if (Array.IndexOf(PageRoles, "everyone") != -1)             return true;           if (Array.IndexOf(PageRoles, "authenticated") != -1)             return true;          foreach (string myrole in myroles)         {             if (!string.IsNullOrEmpty(myrole))             {                 foreach (string searchrole in PageRoles)                 {                      if (myrole == searchrole)                     {                         return true;                     }                 }             }           }                 return false;     }

 

 

转载地址:http://oweyz.baihongyu.com/

你可能感兴趣的文章
Spring Boot 2.4 配置文件将加载机制大变化
查看>>
javascript 用函数语句和表达式定义函数的区别
查看>>
也来玩玩 javascript对象深拷贝,浅拷贝
查看>>
【转载】Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave
查看>>
Kubernetes实战总结 - 动态存储管理StorageClass
查看>>
Oracle一次缩小表空间的处理过程
查看>>
【三思笔记】 全面学习Oracle分区表及分区索引
查看>>
wcf webHttpBinding Post 大数据量提交 ios c#客户端
查看>>
[LeetCode题解]141. 环形链表 | 快慢指针
查看>>
MySQL错误日志(Error Log)
查看>>
MySQL二进制文件(binlog)
查看>>
Redis性能篇(二)CPU核和NUMA架构的影响
查看>>
MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)
查看>>
C基础 带你手写 redis ae 事件驱动模型
查看>>
C基础 工程中常用的排序
查看>>
6.Android-五大布局
查看>>
第3阶段——内核启动分析之start_kernel初始化函数(5)
查看>>
12.Linux之输入子系统分析(详解)
查看>>
19.QT-事件发送函数sendEvent()、postEvent()
查看>>
源码解析之 Mybatis 对 Integer 参数做了什么手脚?
查看>>