本文实例讲述了yii中srbac权限扩展模块工作原理与用法。分享给大家供大家参考,具体如下:
1. 设置权限规则表:可放在module模块配置文件里面
public function init() {
//操作权限表,必须存在以下字段:
//itemname角色名/id,
//type授权项目类型/1(任务)或者2(角色),
//bizrule权限/逻辑运算表达式为false是有权限操作,
//data数据/yii暂无利用
yii::app()->authmanager->itemtable = 'authitem';
//会员组-权限对应表,必须存在以下字段:
//child子角色/id,
//parent父角色/id,此表可循环执行,可多级继承
yii::app()->authmanager->itemchildtable = 'uthitemchild';
//会员-会员组对应表,会员组可直接为操作名称,必须存在以下字段:
//itemname角色名/id,
//userid用户名/id,
//bizrule权限/逻辑运算表达式为false是有权限操作,
//data数据/yii暂无利用
yii::app()->authmanager->assignmenttable = 'zd_mem_glog';
2. 实现规则,所在控制器继承基类sbasecontroller,原来为controller
class productcontroller extends sbasecontroller
{
........
}
class sbasecontroller extends controller
{
........
}
3. sbasecontroller继承基类controller,前填加beforeaction,实现权限验证。
protected function beforeaction($action) {
//载入模块分隔符
$del = helper::findmodule('srbac')->delimeter;
//取得前模块名称
$mod = $this->module !== null ? $this->module->id . $del : "";
$contrarr = explode("/", $this->id);
$contrarr[sizeof($contrarr) - 1] = ucfirst($contrarr[sizeof($contrarr) - 1]);
$controller = implode(".", $contrarr);
$controller = str_replace("/", ".", $this->id);
// 生成静态页面 模块+分隔符+控制器(首字母大写)+方法(首字母大写)例: model-controlleraction
if(sizeof($contrarr)==1){
$controller = ucfirst($controller);
}
$access = $mod . $controller . ucfirst($this->action->id);
//验证访问页面地址是否在总是允许列表里面,是返回有权限
if (in_array($access, $this->allowedaccess())) {
return true;
}
//验证srbac有无安装,没在安装,返回的权限访问
if (!yii::app()->getmodule('srbac')->isinstalled()) {
return true;
}
//验证srbac有无开启,没在开启,返回的权限访问
if (yii::app()->getmodule('srbac')->debug) {
return true;
}
// 权限验证
if (!yii::app()->user->checkaccess($access) || yii::app()->user->isguest) {
$this->onunauthorizedaccess();
} else {
return true;
}
}
4. cdbauthmanager读取当前用户角色
public function getauthassignments($userid)
{
$rows=$this->db->createcommand()
->select()
->from($this->assignmenttable)
->where('userid=:userid', array(':userid'=>$userid))
->queryall();
$assignments=array();
foreach($rows as $row)
{
if(($data=@unserialize($row['data']))===false)
$data=null;
$assignments[$row['itemname']]=new cauthassignment($this,$row['itemname'],$row['userid'],$row['bizrule'],$data);
}
return $assignments;
}
5. cdbauthmanager读取角色对应权限
public function getauthitem($name)
{
$row=$this->db->createcommand()
->select()
->from($this->itemtable)
->where('name=:name', array(':name'=>$name))
->queryrow();
if($row!==false)
{
if(($data=@unserialize($row['data']))===false)
$data=null;
return new cauthitem($this,$row['name'],$row['type'],$row['description'],$row['bizrule'],$data);
}
else
return null;
}
6. cdbauthmanager读取权限对应操作
protected function checkaccessrecursive($itemname,$userid,$params,$assignments)
{
if(($item=$this->getauthitem($itemname))===null)
return false;
yii::trace('checking permission "'.$item->getname().'"','system.web.auth.cdbauthmanager');
if(!isset($params['userid']))
$params['userid'] = $userid;
if($this->executebizrule($item->getbizrule(),$params,$item->getdata()))
{
if(in_array($itemname,$this->defaultroles))
return true;
if(isset($assignments[$itemname]))
{
$assignment=$assignments[$itemname];
if($this->executebizrule($assignment->getbizrule(),$params,$assignment->getdata()))
return true;
}
$parents=$this->db->createcommand()
->select('parent')
->from($this->itemchildtable)
->where('child=:name', array(':name'=>$itemname))
->querycolumn();
foreach($parents as $parent)
{
if($this->checkaccessrecursive($parent,$userid,$params,$assignments))
return true;
}
}
return false;
}
7. cauthmanager验证权限
public function executebizrule($bizrule,$params,$data)
{
return $bizrule==='' || $bizrule===null || ($this->showerrors ? eval($bizrule)!=0 : @eval($bizrule)!=0);
}
8. 总是充许访问规则设置
更多关于yii相关内容感兴趣的读者可查看本站专题:《yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于yii框架的php程序设计有所帮助。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!