我对权限控制系统的看法

控制

请大家给个思路! ---- 刁馋

# 我曾经做了一个权限控制系统,由于需要修改,而我没有找到有效的解决方法,
# 请大家给出出主意,给个大体思路,谢谢!要求如下:
# 1.每个父亲节点下边有多个孩子
# 2.每个孩子可能有一个父亲,还可能有多个父亲(多个父亲的级别可能不同,也
#   就是有交叉现象)
# 3.每个父亲可能管理相同的孩子或者不同的孩子
# 4.每个父亲登陆的时候,只能看到自己的孩子(如果管理的孩子不同,则登陆的
#   父亲只能看到自己下边的孩子,如果相同,那么他们看到的孩子都一样)
# 5.每个父亲可以添加自己的父亲(孩子?)

由问题的提出,可得到如下树状结构。关键在于如何保存这个树和怎样检索。

--0--                          000 (虚拟的根)
                                |
            +-------------------+---------------+
--1--      001                 002             003
            |                   |               |
         +--+--+           +----+----+       +--+--+
--2--   003   004         004  006  007     007   008
               |           |                 |
               |        +--+--+           +--+--+
--3--         007      003   008         001   002
                        |
                   +----+----+
--4--             005  007  006

其中004登录后,应看到(1,001)-[2,004]-(3,007)和(1,002)-[2,004]-(3,003)-(4,007)等
而不应看到(1,003)-(2,007)。
即所有用户在登录后向下搜索孩子,可能在多个分支上进行。

设有两张表
表一保存所有成员的信息(以下简称U),主键id_u
表二为成员间的关系(以下简称K),主键id
U
  id_u | name | ...
-------+------+----
  001  |      |    
  002  |      |    
  003  |      |    
  004  |      |    
  005  |      |    
  006  |      |    
  ...  |      |    

K
id  | id_u | level | next | previons | right
-----+------+-------+------+----------+-------
  1  |  001 |     1 |    2 |          |    5
  2  |  003 |     2 |      |        1 |    3
  3  |  004 |     2 |    4 |        1 |
  4  |  007 |     3 |      |        3 |
  5  |  002 |     1 |    6 |          |   14
  6  |  004 |     2 |    7 |        5 |   12
  7  |  003 |     3 |    9 |        6 |    8
  8  |  008 |     3 |      |        6 |
  9  |  005 |     4 |      |        7 |   10
10  |  006 |     4 |      |        7 |   11
11  |  007 |     4 |      |        7 |
12  |  006 |     2 |      |        5 |   13
13  |  007 |     2 |      |        5 |
14  |  003 |     1 |   15 |          |
15  |  007 |     2 |   16 |       14 |   18
16  |  001 |     3 |      |       15 |   17
17  |  002 |     3 |      |       15 |
18  |  008 |     2 |      |       14 |
    
其中:level 保存级别, next 保存下级的id, previons 保存上级的id, right 保存右邻的id
关于具体的数据组织视算法而定。
数的遍历算法,是很经典的了!
建议用数组计算,即一次性读入到数组,效率可能高一点

测试例,previons项未用
<?
$ar = array(
0,
array(id=> 1,id_u=>"001", level=>1, next=> 2, previons=> 0, right=> 5),
array(id=> 2,id_u=>"003", level=>2, next=> 0, previons=> 1, right=> 3),
array(id=> 3,id_u=>"004", level=>2, next=> 4, previons=> 1, right=> 0),
array(id=> 4,id_u=>"007", level=>3, next=> 0, previons=> 3, right=> 0),
array(id=> 5,id_u=>"002", level=>1, next=> 6, previons=> 0, right=>14),
array(id=> 6,id_u=>"004", level=>2, next=> 7, previons=> 5, right=>12),
array(id=> 7,id_u=>"003", level=>3, next=> 9, previons=> 6, right=> 8),
array(id=> 8,id_u=>"008", level=>3, next=> 0, previons=> 6, right=> 0),
array(id=> 9,id_u=>"005", level=>4, next=> 0, previons=> 7, right=>10),
array(id=>10,id_u=>"006", level=>4, next=> 0, previons=> 7, right=>11),
array(id=>11,id_u=>"007", level=>4, next=> 0, previons=> 7, right=> 0),
array(id=>12,id_u=>"006", level=>2, next=> 0, previons=> 5, right=>13),
array(id=>13,id_u=>"007", level=>2, next=> 0, previons=> 5, right=> 0),
array(id=>14,id_u=>"003", level=>1, next=>15, previons=> 0, right=> 0),
array(id=>15,id_u=>"007", level=>2, next=>16, previons=>14, right=>18),
array(id=>16,id_u=>"001", level=>3, next=> 0, previons=>15, right=>17),
array(id=>17,id_u=>"002", level=>3, next=> 0, previons=>15, right=> 0),
array(id=>18,id_u=>"008", level=>2, next=> 0, previons=>14, right=> 0)
);
//print_r($ar);

function tree($ar,$i,$key,$level) {
  if($ar[$i][id_u] == $key || $ar[$i][level] > $level) {
    for($j=0;$j<$ar[$i][level]-1;$j++)
      echo "    ";
    echo "+--";
    echo $ar[$i][id_u]."<br>";
    if($ar[$i][next] > 0)
      tree($ar,$ar[$i][next],$key,$level);
  }
  if($ar[$i][right] > 0)
    tree($ar,$ar[$i][right],$key,$level);
}

$keys = array("001","002","003","004","005","006","007","008");

while(list($key,$value) = each($keys)) {
  echo "===> $value<br>";
  for($i=1;$i<=count($ar);$i++) {
    if($ar[$i][id_u] == $value) {
      echo "    [$value]<br>";
      tree($ar,$i,$value,$ar[$i][level]);
    }
  }
}
?>

时间: 2024-10-30 14:19:14

我对权限控制系统的看法的相关文章

实现基于Spring框架应用的权限控制系统

摘要 Spring框架是一个优秀的多层J2EE系统框架,Spring本身没有提供对系统的安全性支持.Acegi是基于Spring IOC和AOP机制实现的一个安全框架.本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法. 关键词 Spring :Acegi :认证: 授权 引言 近年来,随着Internet技术的迅猛发展,计算机网络已深入到了人们的工作.学习和日常生活中,于是,怎样构建安全的web应用也成为了当前最热门的话

权限控制中角色冲突问题

问题描述 权限控制系统中涉及到用户表.角色表.权限表.用户角色表.角色权限表,在权限控制过程中用户拥有多个角色,怎样控制角色拥有权限冲突问题. 解决方案 解决方案二:冲突是指什么?一般都取并集吧,比如rolea有p1.p2.p3,roleb有p3.p5.用户如果同时有这两个角色那就是有4个权限嘛解决方案三:每个角色的权限是不变的变得只是角色

大话系统之权限控制

转载:http://www.cnblogs.com/wuhuacong/archive/2009/06/19/1507065.html 权限系统是一个完善项目的基石,权限控制可以分为两部分内容:功能权限控制和数据权限控制.介绍权限控制,必须了解什么是RBAC,RBAC 模型是目前最为广泛接受的权限模型.下面介绍一下RBAC的基本知识. 如果企业的应用比较多,可以把这些控制内容放到一个独立的权限控制系统中,提供相应的权限控制WebService给子系统调用即可,这样就可以以权限系统为中心,建立一系

基于 Spring Security 的开源统一角色访问控制系统 URACS

URACS Java语言开发的统一角色访问控制系统(Unified Role Access Control System),基于Spring Security 3实现的权限控制系统 程序框架版本说明:Spring MVC 3.0.6 + Spring Security 3.1.3 + Hibernate 3.6.10 运行演示例子:  例子使用的是MySQL数据库,也可以支持其它数据库  使用 CreateDb_MySQL.sql 创建好数据库,然后将 URACS.Web.war 部署到 Tom

flex界面切换有几种方法?就是多个模块怎么集成和配合的问题

问题描述 初学Flex,从接触到的书籍和资料没有查到怎么进行复杂布局的方法,只看到用state一个方法,但一个大应用不可能把所有界面都堆在一个mxml了吧,请问各位大侠有哪些方法可以复杂布局,或者说多个mxml之间怎么配合. 问题补充:今天看了多模块之间可以用<mx:module>连接到*.swf来解决界面切换的问题,可以多个swf之间怎么维持会话,比如如果用户知道swf之间的关系的话,可以直接访问改swf而不用通过权限控制系统. 解决方案 1. ViewStack2. ViewStack +

【转载】对 Zookeeper 的一些分析

1. zookeeper 不是为高可用性设计的  由于要跨机房容灾,很多系统实际上是需要跨机房部署的.出于性价比的考虑我们通常会让多个机房同时工作,而不会搭建 N 倍的冗余.也就是说单个机房肯定撑不住全流量(你能设想谷歌在全球只剩下一个机房在干活吗).由于 zookeeper 集群只能有一个 master ,因此一旦机房之间连接出现故障,zookeeper master 就只能照顾一个机房,其他机房运行的业务模块由于没有 master 都只能停掉.于是所有流量集中到有 master 的那个机房,

八一八cvs vss svn和git比较

特征 CVS Git Mercurial Subversion 是否原子提交 CVS: 没有. CVS提交不是原子的 Git: 是的. 提交都是原子的 Mercurial: 是的   Subversion: 提交都是原子的 文件和目录是否可以移动或重命名 CVS: 不是. 重命名不支持. 如果手动进行, 可能会损坏历史记录 Git: 支持重命名, 这是很实用的目的. git甚至能检测到重命名之后文件的改变. 尽管如此, 基于特殊的存储结构, 重命名不会被显示的记录, git能够推导出来(在实际使

System Repair Engineer (SREng) 功能介绍与下载_常用工具

System Repair Engineer (SREng) 是一款计算机安全辅助和系统维护辅助软件.主要用于发现.发掘潜在的系统故障和大多数由于计算机病毒造成的破坏,并提供一系列的修改建议和自动修复方法. 该软件是由 KZTechs.COM 网站站长 Smallfrogs 开发的,能够运行在所有主流的 Windows 操作系统上.          在 System Repair Engineer (SREng) 的帮助下,您可以自己诊断您操作系统可能存在的普遍性问题,即使您是计算机的初学者,

五年磨一剑 今朝把试君-BBSMAX2.0上线

中介交易 SEO诊断 淘宝客 云主机 技术大厅 相关背景介绍: BBSMAX的前身是nowboard(印象论坛),开始开发于2002年,并于2003年发布1.5版本,是国内最早的.net 论坛.当时主要的站长社区(k666.com / 阳光少年网)均使用本bbs.但终因.net在当时门槛仍然太高,其他程序几乎没有,无法配套使用,导致普及有相当难度. 中.国站长站 转眼到了2007年,几年过去了,发生了翻天覆地的变化,.net开始慢慢被广大站长接受.各主流程序开发商均推出了.net版本(discu