YII 访问控制过了filters

来源:互联网 发布:帝国cms ajax提交表单 编辑:程序博客网 时间:2024/04/29 21:02

系统后台:用户登录、后台首页面、商品列表、添加商品、修改商品

 

后天的一些页面在用户没有登录系统的时候是不允许访问的,例如 商品列表添加商品修改商品

 

有一些页面无论用户是否登录系统,都是可以访问的,例如 用户登录

后台代码:

<?php/** * 后台商品管理控制器  */class GoodsController extends Controller {    /*     * 在当前控制器实现用户访问的控制     */    function filters() {        return array(            'accessControl',        );    }        /*     * show  add  update  del 等方法在进行访问的时候需要用户登录系统     * 为具体方法被访问设置条件     */    function accessRules() {        return array(            //用户访问控制扩展            //add 方法可以被无条件访问(无论登录与否都可以访问)            array(                'allow',                'actions'=>array('add'),                'users'=>array('*'), //什么用可以访问            ),                        //具体指定"用户"可以删除信息            //linken zhangsan  lisi 这个三个用户都可以进行删除操作            array(                'allow',                'actions'=>array('del'),                'users' => array('linken','zhangsan','lisi'),            ),                        //匿名用户操作 ?            //有的控制器是匿名用户可以访问,已经登录系统用户是禁止访问的            //update  这个方法是匿名用户可以访问            array(                'allow',                'actions'=>array('update'),                'users'=>array('?'),            ),                        //show 必须是登录系统的用户来访问            array(                'allow',                'actions'=>array('show'),                'users'=>array('@'),            ),            array(                'deny',                'users'=>array('*'),            ),        );    }        /*     * 商品展示     */    function actionShow(){        //通过模型model实现数据表信息查询        //产生模型model对象        $goods_model = Goods::model();                //通过model模型对象调用相关方法帮我们查询数据        //$goods_infos = $goods_model -> find();  //每次只可以查询一条商品信息        //echo $goods_infos->goods_name,"<br />";        //echo $goods_infos->goods_price,"<br />";                //获得全部商品信息findAll()        $goods_infos = $goods_model -> findAll();        //获得全部商品名字的信息        //foreach($goods_infos as $_v){            //$_v就是遍历出来的具体对象        //    echo $_v->goods_name,"----",$_v->goods_price,"<br />";        //}                //通过具体sql语句获得商品信息findAllBySql()        //$sql = "select goods_id,goods_name,goods_price,goods_create_time from {{goods}} limit 10";        //$goods_infos = $goods_model ->findAllBySql($sql);                //var_dump($goods_infos);                //把获得数据信息传递到视图模板里边        //renderPartial('视图名字',传递的变量信息);        //renderPartial('show',array('名字'=>值,'名字'=>值));        //名字:是视图使用的变量名字        //值:当前被传递变量的值                $this ->renderPartial('show',array('goods_infos'=>$goods_infos));    }        /*     * 建立一个测试方法,实现商品数据分页显示     */    function actionShow1(){        //获得数据模型        $goods_model = Goods::model();                //1.获得商品总的记录数目        $cnt = $goods_model -> count();        $per = 6;                //2. 实例化分页类对象        $page = new Pagination($cnt, $per);                //3. 重新按照分页的样式拼装sql语句进行查询        $sql = "select * from {{goods}} $page->limit";        $goods_infos = $goods_model -> findAllBySql($sql);                //4. 获得分页页面列表(需要传递到视图模板里边显示)        $page_list = $page->fpage(array(3,4,5,6,7));                        //调用视图模板,给模板传递数据        $this ->renderPartial('show',array('goods_infos'=>$goods_infos,'page_list'=>$page_list));    }        /*     * 添加商品     */    function actionAdd(){        $goods_model = new Goods();        //echo "<pre>";        //print_r($_POST);        //echo "</pre>";                //判断表单是否有提交过来数据        //$_POST['Goods']其中Goods有个好处,可以在当前控制器接收多个表单信息,只要下标有区分就可以        if(isset($_POST['Goods'])){            //我们要把从表单提交过来的数据赋予$goods_model模型里边            //$goods_model -> goods_name = $_POST['Goods']['goods_name'];            //$goods_model -> goods_price = $_POST['Goods']['goods_price'];            //$goods_model -> goods_number = $_POST['Goods']['goods_number'];            //$goods_model -> goods_category_id = $_POST['Goods']['goods_category_id'];            //$goods_model -> goods_brand_id = $_POST['Goods']['goods_brand_id'];            //$goods_model -> goods_introduce = $_POST['Goods']['goods_introduce'];            //$goods_model -> goods_weight = $_POST['Goods']['goods_weight'];       Yii::beginProfile('addgoods');             //上边代码优化,利用foreach遍历来优化            foreach($_POST['Goods'] as $_k => $_v){                $goods_model -> $_k = $_v;            }            $goods_model -> goods_create_time = time();                        //调用save()方法实现数据添加            if($goods_model -> save()) {                //设置添加商品成功提示信息                Yii::app()->user->setFlash('success','添加商品成功');                //信息添加成功后实现页面重定向(商品列表页面)                //$this -> redirect('./index.php?r=houtai/goods/show');            }         Yii::endProfile('addgoods');        }                $this ->renderPartial('add',array('goods_model'=>$goods_model),false,true);    }        /*     * 修改商品     * 当前这个方法在执行的时候需要get方式传递id信息     * 如果没有id信息则此方法是不允许访问的     */    function actionUpdate($id){        //我们具体修改哪个商品,需要将其信息查询出来        //我们需要知道哪个商品被修改,把商品的id信息通过get方式传递过来        //接收被修改商品id信息               //根据$id查询被修改商品信息        $goods_model = Goods::model();  //除了添加(new Goods)数据我们都使用Goods::model()来实例化模型对象        $goods_info = $goods_model -> findByPk($id);                //修改逻辑与添加逻辑基本一致,创建表单、收集数据、赋予模型、调用save方法        //修改的时候,数据也是赋予数据模型对象里边了        //$goods_info数据模型里边有一些旧的信息,新的信息覆盖旧的信息        if(isset($_POST['Goods'])){            foreach($_POST['Goods'] as $_k => $_v){                $goods_info -> $_k = $_v;            }                        if($goods_info -> save())                $this -> redirect('./index.php?r=houtai/goods/show');        }        //创建数据模型model对象        //new  Goods()  ;   调用save方法的时候给我们执行insert语句        //Goods::model();    调用save方法的时候执行update语句                //$goods_info是我们查询出来的被修改商品的信息,同时也是数据模型对象        //把$goods_info传递到视图模板里边。                $this ->renderPartial('update', array('goods_model'=>$goods_info));    }        /*     * 删除商品信息     * 删除商品信息与修改类似,通过get方式传递被删除商品信息id     */    function actionDel($id){        echo $id,"has deleted";exit;        //根据$id将被删除商品的数据模型对象获得到,通过该对象调用 delete 方法即可删除数据        $goods_model = Goods::model(); //获得数据模型对象        $goods_info = $goods_model -> findByPk($id);  //获得被删除商品的模型对象        //是谁($goods_info还是$goods_model)调用delete        if($goods_info->delete())            $this -> redirect('./index.php?r=houtai/goods/show');     }    }



当用户没有登录时,默认跳转到登录页面,这个默认登录页面在哪里进行设置?

在main配置文件里面:




注意:

有的控制器方法被禁止访问(即使登录用户也如此),如果被访问,那么首先会询问用户是否是登录,如果用户已经登录系统,那么直接是403禁止访问。


定义用户权限:

* 全部用户(无论登录与否)

? 匿名用户

用户名,具体用户

@ 登录系统用户


用户访问控制两个符号:+  -

+  表示过滤器专门是针对哪个方法起作用

表示除了此方法,其他方法都会进行过滤

<?phpclass DefaultController extends Controller{    /*     * 用户访问控制过滤可以针对具体方法起作用     */    function filters() {        return array(            //+ 表示过滤器只针对具体方法起作用            //'accessControl + f1,f2',                        //- 表示除了此方法,其他方法都会起作用            //过滤器除了f1方法外,其他的都会起作用            'accessControl - f1',        );    }        function accessRules() {        return array(            array(                'deny',                'users'=>array('*'),            ),        );    }    public function actionIndex(){$this->render('index');}                public function actionF1(){            echo "I am F1";        }        public function actionF2(){            echo "I am F2";        }        public function actionF3(){            echo "I am F3";        }}

还有关于权限控制srbac,有空再研究

0 0
原创粉丝点击