访问控制过滤器(Access Control Filter的一点小心得 [ 技术分享 ]
最近再看敏捷开发那本书,发现那个外国人写的真不错推荐大家去看看,网上已经有一些无私的PHPer已经翻译出来了,网址:[url=www.yiibook.com]yii book[/url],里面有一部分讲到关于自定义访问控制器的使用,讲的不错,现在拿出来和大家分享一下,请大家多多指教,多多补充....... 在我们用gii建立crud的时候,yiic已经帮助我们完成了大量的代码,其中包括我们今天要说的CController::filters的方法和一个Yii Sytstem 默认提供的过滤方法accessControl,而accessControl通过加载CController::accessRules()的方法对控制器里的每个方法进行访问控制,其中包括基于用户名(*,@,admin)、基于角色、基于IP地址等,这些不是今天要说的重点今天要说的重点是在自定义filter方法。 我们以blog为例,通常情况下POST和COMMENTS是一对多的关系,如何找出指定POST下的COMMENTS,所发的评论在指定的的POST下而不用担心它的ID号是多少,不同的人有不同的方法,我今天使用的一个自定义Fillter方法,通常Filter方法是名是以filter开头的,所以我这里定义
public function filterPostComment($filterChain)
所以先在CommentControl里先定义一个private $_postFix//用来存放POST然后
public function filterPostComment($filterChain)
{
$postId=null;
if(isset($_GET['pid']))
{
$postId=$_GET['pid'];
}else if(isset($_POST['pid']))
{
$postId=$_POST['pid'];
}
$this->loadPost($$postId);
$filterChain->run();//这个不要忘记加上,加这个方法是使该方法加入到过滤链中,并使过滤链的Index+1
}
protected function loadProject($post_id)
{
if($this->_postFix===null)
{
$this->_postFix=Post::model()->findByPk(($post_id);
if($this->_postFix===null)
{
throw new CHttpException(404,'您要访问的页面不存在');
}
}
return $this->_postFix;
}
最后不要忘记把这个方法应要到你想要控制的动作上
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'PostComment + create index admin'
);
}
结论:这样每次访问create index amdin的方法都会先执行PostComment 过渡器,如果指定的PostId不存就不在执行动作抛出异常,否则执行相应的动作,并用相应的反回值,此时的POST都是指定的POST
共 1 条回复
落叶 江苏南京
注册时间:2011-03-29
最后登录:1970-01-01
在线时长:0小时0分
最后登录:1970-01-01
在线时长:0小时0分
- 粉丝8
- 金钱1190
- 威望10
- 积分1290