权限问题,acl_name多个用户组
发布于:2022-01-17 09:50:54
#1 homexigua
现在写权限一行一个,填acl表的时候特别繁琐。如果改成acl_name可以有多个用户组的话只需要一遍就可以了,以后修改就可以啦。
看了大大的:spAcl类中,有对权限判断的方法,如果你要将这个方法改造成自己的方法,比如说原来acl只能判断一个控制器/方法一个角色的,改成可以判断控制器/方法是否还有其他角色,这需要改变到acl的权限判断钩子,和无权限提示钩子(扩展acl的prompt)一样,权限判断钩子是(扩展acl的checker),看spAcl的代码,可以看到checker是默认使用spAclModel的check方法的,所以这个要在index.php设置里面重新设置成你自己的权限判断方法。
想按这种操作,但是不知道具体如何操作。
我是这样想的:
1、首页index.php中配置
'launch' => array(
'router_prefilter' => array(
//array('spAcl','mincheck') // 开启有限的权限控制
array('spAcl','maxcheck') // 开启强制的权限控制
)
),
'ext' => array( // 扩展设置
'spAcl' => array( // acl扩展设置
'prompt' => array("lib_user", "acljump"),
'checker' => array("lib_user","checker"),
)
),
2、在lib_user模型文件中定义
public function check($acl_name = SPANONYMOUS, $controller, $action)
{
$acl_name = explode('|',$acl_name);
$rows = array('controller' => $controller, 'action' => $action );
if( $acl = $this->findAll($rows) ){
foreach($acl as $v){
if($v["acl_name"] == SPANONYMOUS return 1;
elseif(in_array("$v['acl_name'])",$acl_name) return 1;
}
return 0;
}else{
return -1;
}
}
操作的时候acl_name字段直接写成GBADMIN|GBUSER这种类型的,不知是否可行?
上边这段代码对吗?不对该如何修改,对的话如果不改源程序的话应该如何操作?
2010-05-23 11:57:10
#2 azwl
按你的意思似乎应该这样:
public function check($acl_name = SPANONYMOUS, $controller, $action)
{
$rows = array('controller' => $controller, 'action' => $action );
if( $acl = $this->findAll($rows) ){
$a = explode('|',$acl[0]["acl_name"]);
if(in_array($acl_name,$a) return 1;
else
return 0;
}
return -1;
}
}
2010-05-23 14:03:35
#3 azwl
这样写可能效率要高些:
if (false===stripos($acl[0]['acl_name'],$acl_name)
return 0;
else
return 1;
2010-05-23 14:17:11
#4 homexigua
stripos这个不行吧?GBADMIN组和GBA组不一样了么?
再问下$acl[0]["acl_name"]这个是什么意思?
public function check($acl_name = SPANONYMOUS, $controller, $action){
$rows = array('controller' => $controller, 'action' => $action );
if( $acl = $this->findAll($rows) ){
foreach($acl as $v){
$arr = explode('|',$v['acl_name']);
if( $v["acl_name"] == SPANONYMOUS || in_array($acl_name,$a)) ){
return 1;
}else{
return 0;
}
}
}else{
return -1;
}
}
再看下这样写对么》?
2010-05-23 18:53:35
#5 azwl
stripos这个不行吧?GBADMIN组和GBA组不一样了么?
角色用"|"分割,只要 $acl_name."|" 就可以了
再问下$acl[0]["acl_name"]这个是什么意思?
findAll返回的数组的每个元数是数组,按你的方案其实只要用find
2010-05-23 19:12:11
#6 jake
还是顶楼的说法,就是把checker换成自己的逻辑,用于判断权限。
2010-05-24 09:06:13