您的位置:首页 > 其它

通用权限系统设计实现

2015-04-25 14:36 471 查看
<?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);    //创新表单需要登录操作 可以设置某个组才能创建

}

?>


这个是要认证的文件模块是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
//可以不写这个函数,那么不会启用通用权限系统。
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);
}


<?php
/*
*登录信息基本类
*权限表可以缓存数据,登录时候恢复。
*/
class mybase {

b9aa
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目录里面

<?php class myUser extends mybase { } ?>




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RBAC 设计