喜悦国际村 专业PHP开发者社区's Archiver

uuq 发表于 2010-4-16 09:23 PM

通用权限系统设计

大家好, 我目前做了一个通用权限系统
也想跟大家讨论下
我的通用权限系统设计是更换权限时候尽量不要涉及到代码修改

[code language=php]<?php
/*
*控制访问表
*  acl值    功能
*    1        需要登录
*    2         自身修改
*    4         需要组的权限集合         
*    8         需要身份访问集合     
*    16         身份被禁止访问     
*    32         可访问的日期     
*    64         可访问的周日     
*    128         可访问的时间     
*    256         输入密码才能访问     
*    512         超级管理使用     
*/
class aclACL extends acl {
    public $routername="acl";
    public $aclid='2';            //权限资源ID,如果登录人员没有拥用这个权限那么其(下面)它值都为0也不能访问
    public $roledisable=array(9); //禁用身份
    public $pwd=123456;           //密码访问 ACL->noPwd();
    public $date=array('begin'=>0,'end'=>0);   //允许日期之间
    public $hours=array('begin'=>0,'end'=>0);  //一日内小时区间
    public $weeks=array('begin'=>0,'end'=>0);  //一周内周一到周七
    public $aclgroup=array("create"=>"4,45,8"); //create需要的组才能创建
    public $aclrole=array("all"=>"6","create"=>"7,95,78"); //create需要的角色才能创建,该组需要ID为6的角色才能访问
    public $acl=array("all"=>0,
                      "index"=>4,    //表列4表示检查组的组合
                      "delete"=>1,   //删除只登录后删除,当然呆以设置为2或4
                      "update"=>1,   //更新提交只能登录后才能更新,在这里做也防止非法、post,edit是不能访问显示编辑内容页
                      "createForm"=>1, //也不能新提交数据库
                      "edit"=>0,       //登录才显示编辑框
                      "show"=>0,       //不用登录也能显示
                      "create"=>1);    //创新表单需要登录操作 可以设置某个组才能创建

}  

?>  [/code]

这个是要认证的文件模块是acl
每当用户访问acl模块时候,如果开启了认证那么会调用这个类
然后这个类会根据$acl 的all或index等值去做认证检查。


把这个文件放在router/acl目录里面就可以了,框架会自动认证如果用户没有相应的正向授权是无法访问相应的限制的。
比如crud create方法 负向权限为17 那按照前面解释应该是 需要登录和组授权 就是$aclgroup 数组中create的4 45 8三个组,
首先会员没有登录将提示登录,如果会员不在这三个组是无法访问该方法的会提示没有权限。

目前router可以自己根据情况开启用acl控制
方法是在xxxxRouter.class.php文件中 添加 public function isAcl(){}  
可以返回权限文件名比如返回curd,那么自动会调用curdACL.class.php类和名
curdRouter类设置验证

[code language=php]<?php
class curdRouter extends controller{
     
    //返回 RBAC 控制访问列表验证类默认是跟router同名也就是curd
    //可以不写这个函数,那么不会启用通用权限系统。
    public function isAcl(){}   
    public function index()
    {
       $booktype=M("booktype");
       $this->pager=C("pager");//取得分类
       $this->pager->setPager($booktype->count(),10,'page');//取得数据总数中,设置每页为10
       $this->assign("list",$booktype->orderby("bookid desc")->limit($this->pager->offset(),10)->fetch()->getRecord());
    }
public function login(){  //登录页面
  
  }
  public function logout(){ //退出页面

      MY()->logout(); //退出登录
     redirect(url_for("guestbook/index"),"退出成功",3);
  }
  public function noAcl($mask) { //处理一下如果没有权限转向登录
      redirect(url_for("guestbook/login"),"需要登录",3);
  }
  public function loginpost() {  //登录提交地方 简单处理下登录认证
      if($_POST['author']=='queryphp'&&md5($_POST['pwd'])==md5('123456'))
    {
      MY()->setLogin(); //设置登录状态
      redirect(url_for("guestbook/adminlist"),"登录成功",3);
    }
    redirect(url_for("guestbook/login"),"登录失败",3);
  }[/code]


[code language=php]<?php
/*
*登录信息基本类
*权限表可以缓存数据,登录时候恢复。
*/
class mybase {
  public $options=array();
        public $uid;
  public $username;
  public $isadmin;
  public $role=array();  //我使用的身份
  public $group=array(); //我所在组
  public $grouprole=array(); //组的身份
  public $mygroupMar=array(); //我拥有管理的组
  public $mygroupOwn=array(); //属于我的组
  public $acl=array();       //主动控制表 groupacl和myacl控制权限集合 内容是rbac的rbacid
  public $groupacl=array();  //组拥用的控制权限
  public $myacl=array();     //我的身份拥用的控制权限
  public $loginfaild=0;      //登录失败次数 如果超过这个数应该禁止IP登录几分种[/code]


这是基本
可以把myUser.class.php放在项目lib目录里面

[code language=php]<?php class myUser extends mybase {
} ?>[/code]
使用MY()函数就可以取得myUser了。

因为我传不了图片 下面是chinaunix.net的图

[img]http://life.chinaunix.net/bbsfile/month_1004/10041621002a08c3f5d3d41769.gif[/img]

[img]http://life.chinaunix.net/bbsfile/month_1004/1004162100ade51a52e1de4c85.png[/img]

下载测试例子和chm手册
code.google.com/p/queryphp/downloads/list

good8 发表于 2010-4-22 07:49 PM

关注!请问下载的queryphp0.9.9beta.zip有没有添加通用权限?

uuq 发表于 2010-4-27 07:17 PM

没有,目前是手工的
通用程序,目前正在写,这个会在1.0beta版发布

shuai0506008 发表于 2010-5-16 10:52 AM

我要下 :lol

enigma1223 发表于 2010-8-14 09:26 AM

有没有发布1.0beta的时间表呢?

uuq 发表于 2010-10-2 06:48 PM

通用系统已发布最新版
有现在演示程序
http://demo.queryphp.com/project/main.php

梦幻蓝天 发表于 2011-8-5 04:55 PM

水平很高啊,值得学习

王抚州 发表于 2012-4-11 03:44 AM

[img]http://info.chongfeng.info/adimg/bbstop.gif[/img]非常酷哦,不顶对不起良心






[img]http://img.tongji.linezing.com/1816979/tongji.gif[/img]

dahaigfz 发表于 2012-5-8 11:08 AM

看帖子的都发表一下看法

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.