通用权限系统设计[转]
通用权限系统设计是更换权限时候尽量不要涉及到代码修改
/* 03 *控制访问表 04 * acl值 功能 05 * 1 需要登录 06 * 2 自身修改 07 * 4 需要组的权限集合 08 * 8 需要身份访问集合 09 * 16 身份被禁止访问 10 * 32 可访问的日期 11 * 64 可访问的周日 12 * 128 可访问的<span class="t_tag" onclick="tagshow(event)">时间</span> 13 * 256 输入密码才能访问 14 * 512 超级管理使用 15 */ 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, //更新提交只能登录后才能更新,在这里做也防止非法、<span class="t_tag" onclick="tagshow(event)">post</span>,edit是不能访问显示编辑内容页 "createForm"=>1, //也不能新提交<span class="t_tag" onclick="tagshow(event)">数据库</span> "edit"=>0, //登录才显示编辑框 "show"=>0, //不用登录也能显示 "create"=>1); //创新表单需要登录操作 可以设置某个组才能创建 } ?> |
这个是要认证的文件模块是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类设置验证
<?php class curdRouter extends controller{ //返回 RBAC 控制访问列表验证类默认是跟router同名也就是curd //可以不写这个<span href="tag.php?name=%BA%AF%CA%FD" onclick="tagshow(event)" class="t_tag">函数</span>,那么不会启用通用权限系统。 public function isAcl(){} public function index() { $booktype=M("booktype"); $this->pager=C("pager");//取得分类 $this->pager->setPager($booktype->count(),10,'page');//取得<span href="tag.php?name=%CA%FD%BE%DD" onclick="tagshow(event)" class="t_tag">数据</span>总数中,设置每页为10 $this->assign("list",$booktype->orderby("bookid desc")->limit($this->pager->offset(),10)->fetch()->getRecord()); } public function login(){ //登录<span href="tag.php?name=%D2%B3%C3%E6" onclick="tagshow(event)" class="t_tag">页面</span> } 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); } ///////////////////////////////////////////// 缓存数据,登录时候恢复。 */ 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登录几分种 //////////////////////////////////////// //这是基本可以把myUser.class.php放在项目lib目录里面 //////////////////////////////////////// |
使用MY()函数就可以取得myUser了。
下载测试例子和chm手册
http://code.google.com/p/queryphp/downloads/list


最新评论