要用session来控制用session来保存登录用户的多个属性当其进入页面时再进行校验

解决方案 »

  1.   

    我的方法是:
    各个模块都存入数据库中,如:
      
      标志           名称
       A           人事管理
       AA          查看个人档案
       AB          修改档案
     在这个账号的权限字段里写上:AA-AB 就表示这个人可以查看"个人档案"及"修改档案"。类似这样的。
    另外,可将权限字段用SESSION存起来,每个页面再用代码分析,正如sdliubo(Fuck Japanese!)所说的。很想听听更好的方法。up
      

  2.   

    <?php//////供每个页面掉用的函数///($ulogin->登录用户的ID号;$operationid->各页面及按扭的ID号)//////////
    ///////好比判断一个按扭该用户有没有则可以if(Pright($ulogin,$oterationid)){echo "<input type=button>";}其中$ulogin用户登进来session记录的用户的userid,而$oterationid整个功能表里的该按扭功能的ID因为要分功能则必有所有功能的功能表,且这个表是系统一开始就有初始数据的
    function Pright($ulogin,$operationid){               
         //PAGE_SCAN($ulogin,$operationid);
             switch(Security($ulogin))
             {
     
          case 'hinder':return false;break;
                  case 'right':switch(overrides($ulogin,$operationid)){
    case 'T':return true;break;
    case 'F':return false;break;
    case 'O': if(pageright($ulogin,$operationid)){
      return true;
      }else{ 
      return false;
      }
      break;
    }
             break;
      case 'authority':return true;break;
      default:return false;break;
      
             }
    }////////////////////////判断用户是否受权限约束///////////////////
    function Security($ulogin){
    GLOBAL $CONFIG;
    $CONFIG->query="select username,isactive,securityenabled from userjob where username='".$ulogin."' and isactive='T'";
    $result=db_query("select");   
    $rows=count($result)-1;
    if($rows>0){
    for($i=0;$i<$rows;$i++){
     if($result[$i][securityenabled]=='T')
     return 'authority';
    }
    return 'right';
    }else{
     return 'hinder';
     }
     
    }///////////////判断用户在该模块中的权限//////////////////////////////////////
    function pageright($ulogin,$operationid){
     GLOBAL $CONFIG;
     $right=Jobright($ulogin);
     if($right){
             for($i=0;$i<count($right);$i++)
     {
     $CONFIG->query="select * from operation,groupjob where groupjob.groupname='".$right[$i][jobid]."' and groupjob.operationid='".$operationid."' and groupjob.operationid=operation.operationid";
     //echo $CONFIG->query;
     $jobright=db_query("select");
     if(!empty($jobright[0][operationid])){
     return true;
                     }
     }
     return false;
    }else{
    return false;
    }
    }
    ///////////////////判断用户是否有有效的JOBID///////////////////////
    function Jobright($ulogin){
    GLOBAL $CONFIG;$j=0;
    $CONFIG->query="select * from userjob where username='".$ulogin."'";   
    $jobid=db_query("select");
    $jobidrows=count($jobid)-1;
    for($i=0;$i<$jobidrows;$i++){
           if((dateformt($jobid[$i][startdate])<=date("Ymd"))&&(date("Ymd")<=dateformt($jobid[$i][enddate])))
    {
     $right[$j][jobid]=$jobid[$i][groupname];
     $j++;
    }
    }

    if(count($right)>0)return $right; else return false;
    }function dateformt($date)
    {
    $year=substr($date,0,4);
        $month=substr($date,5,2);
    $day=substr($date,8,2);
    return $year.$month.$day;
    }
    //////////////从用户附加功能表中读取operationid(功能代号)///////////////////////////////
    function overrides($ulogin,$operationid)
    {
      GLOBAL $CONFIG;
      $CONFIG->query="select * from operation,overrides where overrides.username='".$ulogin."' and overrides.operationid='".$operationid."' and overrides.operationid=operation.operationid";
      //echo $CONFIG->query;exit;
      $overrides=db_query("select");
      $overridesrows=count($overrides)-1;
      
      if($overridesrows>0){
      if($overrides[0][enabled]=='T'){
      return 'T';
      }else if($overrides[0][enabled]=='F'){
      return 'F';
      }else{
      return 'O';
      }  }else{
      return 'O';
      }
    }//////////////检测功能块的安全等级//////////////////////////////////////
    /*
    function loginlevel($operationid){
      GLOBAL $dbSetting,$sysLang;
      $level = new database($dbSetting->dbsystem,$dbSetting->dbhost,$dbSetting->dbname,$dbSetting->dbuser,$dbSetting->dbpwd,$sysLang->language);    
      $levelwhere="operationid='p".$operationid."'";
      $level->query=create_select("loginlevel","p29012",$levelwhere,"1","No","No","No","No");        
      $level->db_query("select");
      switch(trim($overrides->result[0][loginlevel]))
      {
               case '0':
       case '1':
       case '2':return true;break;
       case '3':break;
       default: return true;break;
          }
    }
    */////////////////判断是否有效登录//////////////////
    function USER_LOGING(){
    GLOBAL $SAS_SESSION;
    if (!empty($SAS_SESSION[uloginid][username])){
            return true;
    }else{
    return false;
    }
    }///////////////判断用户是否对该界面有权限//////////////////
    function PAGE_SCAN($ulogin,$operationid){
    GLOBAL $PAGE_RIGHT;
        if(USER_LOGING()){
    switch(Security($ulogin))
             {
     
          case 'hinder':echo "无该页权限!";exit;return false;break;
                  case 'right':switch(overrides($ulogin,$operationid)){
    case 'T':return true;break;
    case 'F':echo "无该页权限!";exit; return false;break;
    case 'O': if(pageright($ulogin,$operationid)){
      return true;
      }else{ 
      echo "无该页权限!";exit; return false;
      }
      break;
    }
    break;
      case 'authority':return true;break;
      default: echo "无该页权限!";exit;break;
         }
    }else{
      echo "请登录后再访问!";exit;
      return false;
    }
    }
    ?>
      

  3.   

    # --------------------------------------------------------
    #
    # Table structure for table 'users'
    #CREATE TABLE users (
       userid int(11) NOT NULL auto_increment,
       username varchar(20) NOT NULL,
       passwd varchar(50) NOT NULL,
       logincount int(11) NOT NULL,
       lastlogin datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
       groupname varchar(20) NOT NULL,
       admin int(11) NOT NULL,
       PRIMARY KEY (username),
       KEY id_2 (userid)
    );
    # --------------------------------------------------------
    #
    # Table structure for table 'userjob'
    #CREATE TABLE userjob (
       userjobid int(11) NOT NULL auto_increment,
       username varchar(30) NOT NULL,
       groupname varchar(30) NOT NULL,
       startdate date DEFAULT '0000-00-00' NOT NULL,
       enddate date DEFAULT '0000-00-00' NOT NULL,
       isactive char(1) NOT NULL,
       securityenabled char(1) NOT NULL,
       currtime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
       PRIMARY KEY (username, groupname),
       UNIQUE userjobid (userjobid),
       KEY userjobid_2 (userjobid)
    );
    # --------------------------------------------------------
    #
    # Table structure for table 'groups'
    #CREATE TABLE groups (
       groupid int(11) NOT NULL auto_increment,
       enname varchar(20) NOT NULL,
       cnname varchar(20) NOT NULL,
       PRIMARY KEY (groupid, enname, cnname),
       UNIQUE groupid (groupid),
       KEY groupid_2 (groupid)
    );# --------------------------------------------------------
    #
    # Table structure for table 'groupjob'
    #CREATE TABLE groupjob (
       groupname varchar(30) NOT NULL,
       operationid varchar(10) NOT NULL,
       PRIMARY KEY (operationid, groupname),
       KEY operationid (operationid)
    );
    # --------------------------------------------------------
    #
    # Table structure for table 'operation'
    #CREATE TABLE operation (
       operationid varchar(10) NOT NULL,
       operationnm varchar(80) NOT NULL,
       submodnm varchar(20) NOT NULL,
       PRIMARY KEY (operationid),
       UNIQUE operationid (operationid),
       KEY operationid_2 (operationid)
    );
    # --------------------------------------------------------
    #
    # Table structure for table 'overrides'
    #CREATE TABLE overrides (
       username varchar(30) NOT NULL,
       operationid varchar(10) NOT NULL,
       enabled char(1) NOT NULL,
       PRIMARY KEY (username, operationid),
       KEY operationid (operationid)
    );INSERT INTO users VALUES (1,'sas','dTbioRNb5evB6',0,'NOW()','sas',1);   INSERT INTO groups VALUES (1,'sas','系统管理');
    INSERT INTO userjob VALUES (1,'sas','sas','2002-06-17','2003-06-17','T','T','NOW()');
    //////功能初始数据如下
    INSERT INTO operation VALUES( '0200100000', 'OA--个人办公', '个人办公');
    INSERT INTO operation VALUES( '0200100100', 'OA--个人办公--事务提醒', '个人办公');
    INSERT INTO operation VALUES( '0200100200', 'OA--个人办公--即时通信', '个人办公');
    INSERT INTO operation VALUES( '0200100300', 'OA--个人办公--日程安排', '个人办公');
    INSERT INTO operation VALUES( '0200100301', 'OA--个人办公--日程安排--新增安排', '个人办公');
    INSERT INTO operation VALUES( '0200100302', 'OA--个人办公--日程安排--添加注释', '个人办公');
    INSERT INTO operation VALUES( '0200100303', 'OA--个人办公--日程安排--完成进度', '个人办公');
    INSERT INTO operation VALUES( '0200100304', 'OA--个人办公--日程安排--更改安排', '个人办公');
    INSERT INTO operation VALUES( '0200100305', 'OA--个人办公--日程安排--取消安排', '个人办公');
    INSERT INTO operation VALUES( '0200100400', 'OA--个人办公--公司通讯录', '个人办公');
    INSERT INTO operation VALUES( '0200100500', 'OA--个人办公--个人通讯录', '个人办公');
    INSERT INTO operation VALUES( '0200100501', 'OA--个人办公--个人通讯录--查寻记录', '个人办公');
    INSERT INTO operation VALUES( '0200100502', 'OA--个人办公--个人通讯录--添加记录', '个人办公');
    INSERT INTO operation VALUES( '0200100503', 'OA--个人办公--个人通讯录--修改', '个人办公');
    INSERT INTO operation VALUES( '0200100504', 'OA--个人办公--个人通讯录--删除', '个人办公');
    INSERT INTO operation VALUES( '0200100600', 'OA--个人办公--个人资料', '个人办公');
    INSERT INTO operation VALUES( '0200100700', 'OA--个人办公--桌面设定', '个人办公');
      

  4.   

    看看 vbb 和 phpBB 不就得了
      

  5.   

    使用方法如下,逻辑是对于一套系统管理员可对具体的组部门及不同的人分配可用功能,然而具体到用户的话呢则是,到某功能点是先判断自己有没有该项功能,如果没有且没有禁止该项功能,那就看他所属的组有没有该项能。<td align="right" class="Fnt12pxB">
      <?php  if(Pright($SAS_SESSION[userlogin][uloginid],"0200600203")){  ?>
      <INPUT TYPE="button" class="ipsub" value="查看库存" onclick="javascript:location.href='showstock.php';">
      <?php } ?>
      <?php  if(Pright($SAS_SESSION[userlogin][uloginid],"0200600204")){  ?>
      <INPUT TYPE="button" class="ipsub" value="查看分配" onclick="javascript:location.href='allotres.php';">
      <?php } ?>
                      </td>
                    </tr>
      

  6.   

    能不能发给我一个啊
    [email protected]
      

  7.   

    用户表
      用户号
      。。
    用户角色表
      用户号
      角色号角色表
      角色号
      。。
    权限表
      权限号
      菜单号
      。。
    角色权限表
      角色号
      权限号利用用户的登陆id的这个session
    在每个页面上面得到权限直,调用函数显示是否可以
    利用上面的表建立一个视图,3个字段(用户号,权限直,菜单号)
    这个试图通过用户表,用户角色表,角色表,角色权限表,权限表连接查询得出,通过视图可以提高速度简化提取过程。如果没有视图就直接写sql了
    function getRight(UserId, MenuId)
    {
        global $database,$host,$dbusername,$dbpassword;
        $conn=new DB_Sql();
        $conn->connect($database, $host, $dbusername,$dbpassword);
        $query="select RightTag from view_user_right";
        $conn->query($query);
        $conn->next_record();
        return $conn->f(RightTag);
    }
    在也面中你可以在也面前加一个
    <?php
    $menu_id=99;
    if (getRight($s_user_id,$menu_id)==0)//have no right
        header ("location:noright.php");
    ?>
    同时为了控制写权限和读权限,可以在按扭中家一个函数如下
    <input type="button" onclick="wendow.location='del.php?id=<?php echo $mydb->f(id);?>'" checkright($s_user_id,$menu_id)>
    这个checkright的函数如下
    fucntion checkright()
    {
        if (getRight($s_user_id,$menu_id)==1)//only have read right
        {
            echo "disabled";//让按扭不能工作
        }
        else if (getRight($s_user_id,$menu_id)==2)//have write right
        {
            echo "";
        }
    }
    这样就可以实现通过用户角色机智,和按扭屏蔽控制权限
        
      

  8.   

    那个视图比较简单,全是and连接,用sqlserver的工具一下就生成了。
    最好做成试图,因为视图比多表查询快。(放在内存中的)
      

  9.   

    这是MIS中最普遍的问题。比较常见的办法是将用户分角色、分部门。
    但需要注意的是,同一个用户可以属于多个角色,也可以同时属于多个部门。而角色和部门对于用户来讲是共存的。
    所以一共设计以下几张表:
    用户表:字段:USERNAME,PASSWD 用于存放用户名/密码
    角色表:ACTOR_ID,USERNAME 用于表示用户属于哪个角色,一个用户可以有多条记录。
    部门表:BUMEN_ID,USERNAME 用于表示用户属于哪个角色,一个用户可以有多条记录。
    角色-权限表:ACTOR_ID,BLOCK_ID,QX 用于表示角色在版块的权限值,这样你需要把所有的页面都给上一个版块号。
    部门-权限表:BUMEN_ID,BLOCK_ID,QX 用于表示部门在版块的权限值。这样可以写出一个统一的函数,取得某一个用户在某一个版块的权限。这里权限采用“并”的方式,即只要有一个角色或一个部门有权限则表示有权限,多个角色、多个部门都有权限则取权限的最大值。如果有特殊情况需要临时增加和减少权限,则需要多加一张表:
    USERNAME,BLOCK_ID,QX 如果在这个表中有记录,则取这张表的值,如果没有则按上面的办法取权限值。这张表还可以加上起始时间字段,这样临时设置的权限可以在一定的时间内有效。页面的判断。首先要对整个系统设置版块。每个页面根据版块设置版块号。然后将用户名(一般用SESSION)和版块号传入权限函数取得权限值,根据这个权限值在页面上用程序判断即可
      

  10.   

    我是个新手,我觉得我用cookie也能实现这样的功能,就是在用户登陆是将它的用户名保存到cookie中,然后再对该值通过用户表进行分析判断该用户属于那种权限,那就可以让他访问相应的内容。
      

  11.   

    name //名子
    group //组
    site //职位
    other //其它
    is_enter //能否进入
    以上是数据库的各个字段
    每次进入前将你事先设定好的条件update一下你的is_enter这个字段的内容,能访问者为1,不能者为0,然后根据其值进行操作就是了;
      

  12.   

    yueok(悦)的方法值得学习。角色可以理解为组,一个组可以拥有多个用户,一个用户可以隶属于多个组。当你建立一个文件,可以给他赋权限,可以指定组,也可以指定用户。指定组后则该组中所有用户都有权访问。指定用户后则只有该用户有权访问。这个机制挺好,不过实现起来也挺复杂呀
      

  13.   

    不复杂,不管你是php还是pb,还是domino。j2ee
    这样的数据库结构和实现截止都是比较成熟的结构。
    做oa嘛都是你抄我,我抄你。
      

  14.   

    我的方法比较笨 但是感觉数据库简单 嘿嘿 admin得表里面多一个权限字段 然后,我们可以任意赋予一个人权限,就是,每个版块都给不同的权限 那么,前台通国radio,然后,php处理,将它们组合成一个0|1|1|0|1…………类似那样的字符串插入到数据库权限字段里面 然后,登陆的时候读取,然后拆分成数组,注册给session
    然后不同的版块判断一下session就可以啦:)
      

  15.   

    你可以看看这个权限控制
    开源的
    http://phpgacl.sourceforge.net/
    非常强大
    有完整文档和demo
      

  16.   

    好办法,觉得还是yueok(悦)的方法不错,学习一下