`
axgle
  • 浏览: 93504 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

php AuthRelationship v0.0.1发布:世界上最简洁给力的rbac实现

PHP 
阅读更多
<<采用mixin原理实现的rbac解决方案>>之php版:AuthRelationship v0.0.1
作者:axgle
功能特征(write less,do more):
1.支持一个用户扮演多个角色
2.角色可以继承,可以包含其他角色
3.支持task,task就像角色一样
4.支持business rule(业务规则)
5.支持统一的operation名称检查(例如master的edit和author的edit,edit名称相同,但业务规则不同,author只能编辑自己的,但权限检查的时候依然用"edit"这个名称).

实现原理:
用户与AuthItem之间的关系约定:
1.AuthItem的定义: 角色,task,operation,统称AuthItem
2.mixin原则: 任何AuthItem可以有多个Child与之关联(把Child AuthItem mixin到某个AuthItem)
3.单项分配原则: 一个用户只能有一个"直接"的AuthItem与之关联

根据以上约定,则自然一个用户可以有多个AuthItem与之"间接"关联(可以解决一个用户多个角色的问题).
使用举例:读者可以阅读,作者可以创建,阅读,编辑他自己的帖子;编辑可以有作者的所有权限,还可以编辑所有人的,可以publish,master有编辑的所有权限,而且可以删除,具备create权限的人,就同时具备了创建帖子和评论的权限.问:master可以创建评论么?
$config=array(
        'reader'=>array('read'),
        'author'=>array('create','read', 'edit'=>'return $author_id==$user_id;'),        
        'editor'=>array('author','edit','publish'),
        'master'=>array('editor','delete'),

        'create'=>array('createPost','createComment')
);
$ar=new AuthRelationship($config);
echo (int)$ar->checkAccess('master', 'createPost', array('author_id'=>1, 'user_id'=>2));

你可以尝试其他各种checkAccess,比如author能否编辑,以及editor能否编辑,改变业务规则,或者让user_id=1等等...
分享到:
评论
1 楼 tonyseek 2011-02-20  
其中的 eval 是不是换成匿名函数或者闭包来实现更好些呢?

相关推荐

Global site tag (gtag.js) - Google Analytics