通用权限系统怎么设计

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

<?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 {
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 {

}
?>

使用MY()函数就可以取得myUser了。


...全文
2087 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
bonlog 2012-03-22
  • 打赏
  • 举报
回复
演示地址打不开啊,
还有太难了吗《有这般麻烦吗?
uuq 2011-02-16
  • 打赏
  • 举报
回复
权限也可以使用在视图方面
这样可以根据什么样的模块权限显示什么样的内容。

原理是 拥用这个模型的权限才显示里面的内容。

只是要求权限文件一定要用程序能搜索到
目前只搜索框架目录module下面有没有权限文件
uuq 2010-10-01
  • 打赏
  • 举报
回复
http://demo.queryphp.com/project/main.php
演示地址
blizzf99 2010-09-30
  • 打赏
  • 举报
回复
頂貼學習。

uuq 2010-09-29
  • 打赏
  • 举报
回复
目前实现了代码编写
最新程序可下到google 下载
http://code.google.com/p/queryphp/downloads/list


weijiepeng 2010-04-19
  • 打赏
  • 举报
回复
mark
若非零落 2010-04-19
  • 打赏
  • 举报
回复
学习中。。。
uuq 2010-04-18
  • 打赏
  • 举报
回复
目前写完成这个后台再说其它功能。
uuq 2010-04-17
  • 打赏
  • 举报
回复
人多用了,就是多种意见和建议。主要是看看别人的想法
uuq 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 mu_rain 的回复:]

引用 20 楼 uuq 的回复:

用CS_check_permissions($access_name) 判断用户是否有相应的权限
我就是要避免在程序中使用这种判断程序
这种样子又不够灵活


嗯,能做到这样去实现依赖倒置当然更好。 我那只是一个偷懒的方法,适合中小型。
[/Quote]

主要是有时候变了,又要改程序,不太好。如果在前面就检测了,这样又不会对程序造成什么影响
我们不要时候可以不要,但是你放了这个代码,不要权限时候又得去删除这个代码
uuq 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 weijiepeng 的回复:]

画图软件不错
[/Quote]

用fireworks画就可以了
uuq 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 helloyou0 的回复:]

uuq,
你的google code里的中文文件能否都放个utf8版本?
在google code svn的browse里没法直接看
[/Quote]

刚看下还真有些php文件是ansi格式

[Quote=引用 25 楼 luojxun 的回复:]

我倒觉得将权限生成json较简单

按楼主的设计思路,如果要解决一个模块下的子模块权限问题,应该再设计一个用户自定义的权限表。
[/Quote]
可以使用json存起来

如果要解决一个模块下的子模块权限问题
添加一行就可以了
比如:
public $acl=array("all"=>0,
"index"=>4, //表列4表示检查组的组合
添加一行显示show方法权限
public $acl=array("all"=>0,
"index"=>4, //表列4表示检查组的组合
"show"=>4, //表列4表示检查组的组合
这个也要加一个ID值
public $aclid=array(2,3); //权限资源ID,如果登录人员没有拥用这个权限那么其(下面)它值都为0也不能访问
比如show 在rabc表中ID是3 因为这个在访问时候会检查,比如用户没有这个ID权限是访问不了的
mu_rain 2010-04-16
  • 打赏
  • 举报
回复
学习了。
luojxun 2010-04-16
  • 打赏
  • 举报
回复
我倒觉得将权限生成json较简单

按楼主的设计思路,如果要解决一个模块下的子模块权限问题,应该再设计一个用户自定义的权限表。
helloyou0 2010-04-16
  • 打赏
  • 举报
回复
uuq,
你的google code里的中文文件能否都放个utf8版本?
在google code svn的browse里没法直接看
mu_rain 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 uuq 的回复:]

用CS_check_permissions($access_name) 判断用户是否有相应的权限
我就是要避免在程序中使用这种判断程序
这种样子又不够灵活
[/Quote]

嗯,能做到这样去实现依赖倒置当然更好。 我那只是一个偷懒的方法,适合中小型。
uuq 2010-04-16
  • 打赏
  • 举报
回复
我的系统程序里面要不带权限认证程序
添加权限和减少权限不用修改程序
www_7di_net 2010-04-16
  • 打赏
  • 举报
回复
汗,这个太复杂了,你把简单的事情给复杂化了,我采用了asp版的tsys思路做了一个php的通用权限控制系统,身材虽小,可是能力暴强悍
standford 2010-04-16
  • 打赏
  • 举报
回复
LZ是高手啊,我看到LZ经常回答问题。我也好好看看这个权限系统
uuq 2010-04-16
  • 打赏
  • 举报
回复
queryphp框架文档大更新 图片上传 通用权限系统

http://code.google.com/p/queryphp/downloads/list


先发布一版,可以先预览下通用权限系统
加载更多回复(26)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧