YII 访问控制

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

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

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

后台代码:

<?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禁止访问。

定义用户权限:

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

l ? 匿名用户

l 用户名,具体用户

l @ 登录系统用户

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

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

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

<?php

class 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";
        }
}
时间: 2024-12-12 16:27:03

YII 访问控制的相关文章

Yii 权限分级式访问控制实现(非RBAC法)

以下由我们在信易网络公司开发项目的时候终结出的一些经验 主要参考资料:yii官网http://www.yiiframework.com/wiki/60/yii framework 提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,我这里要讲的是第一套(因为我也刚刚学到这里).如 果你有研究过YII官方的demo blog,一定知道,比如,由gii自动生成的user模块,自动附带了简单的filter权限分配功能,具体细节请参照blog手册的"用户验证&

Yii中 RBAC(基于角色的访问控制权限)表结构原理分析

这里有几个概念很重要,我简单用大白话说一下; 权限:就是指用户是否可以执行哪些操作. 如:小张可以发帖.回帖.浏览,小红只能回帖.浏览 角色:就是上面说的一组操作的集合. 如:高级会员有发帖.回帖.删贴.浏览的权限,普通会员只有回帖.浏览的权限.比如小张是高级会员,那么他就可以执行发帖.回帖.删贴.浏览.而小红是普通会员,所以它就只能回帖.浏览. 另外角色还可以继承,中级会员除了普通会员的回帖.浏览功能外,还可以发帖.也就是说在普通会员的基础上又增加了一个发帖的权限. 在Yii2.0中 yii\

yii2项目实战-访问控制过滤器ACF讲解

作者:白狼 出处:http://www.manks.top/document/yii2-filter-control.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 什么是访问控制过滤器?字面上来理解就是访问授权呗,对一些具体的操作设定一些规则进行权限控制. 当然,这里的[操作]即是指控制器的action了. 前面我们添加新用户的时候,不知你可有疑问:为什么我们访问主页(site/index)就让我们登录,但是我

(转)yii流程,入口文件下的准备工作

yii流程 一 目录文件 |-framework     框架核心库 |--base         底层类库文件夹,包含CApplication(应用类,负责全局的用户请求处理,它管理的应用组件集,将提供特定功能给整个应用程 序),CComponent(组件类,该文件包含了基于组件和事件驱动编程的基础类,从版本1.1.0开始,一个行为的属性(或者它的公共成员变量或它通 过getter和/或setter方法??定义的属性)可以通过组件的访问来调用),CBehavior(行为类,主要负责声明事件和

YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析

这里有几个概念很重要,我简单用大白话说一下;权限:就是指用户是否可以执行哪些操作.如:小张可以发帖.回帖.浏览,小红只能回帖.浏览角色:就是上面说的一组操作的集合.如:高级会员有发帖.回帖.删贴.浏览的权限,普通会员只有回帖.浏览的权限.比如小张是高级会员,那么他就可以执行发帖.回帖.删贴.浏览.而小红是普通会员,所以它就只能回帖.浏览.另外角色还可以继承,中级会员除了普通会员的回帖.浏览功能外,还可以发帖.也就是说在普通会员的基础上又增加了一个发帖的权限.在Yii2.0中 yii\rbac:

第一章:认识Yii

第一章:认识Yii 认识Yii 在过去几年中,框架迅速发展,几乎在Web应用开发中,每个人都会涉及到一个新生框架,Web开发框架会帮助你加快你的应用程序发布,你只需迅速的把你的想法在框架的白板上书写功能代码.随着Web应用的实现具有共同特征,现有的框架方案已经满足这些要求,在今天还有什么理由要从头开始你的下一个Web应用呢?今天的Web开发,除程序自身语言外,一个现代化.灵活的和可扩展的框架,几乎是一个至关重要的编程工具,此外,如果语言与框架两个部份有特别的互补性,结果是将一个非常强大的工具包:

PHP框架Yii编码规范

文件方法命名 文件名即类名 类名称: 驼峰式 首字母大字 class PointController class PointRatioController 公共成员方法: 驼峰式 首字母小写 public function getPointById() 私有成员方法: 驼峰式 首字母小写 private function _getPointById() 公共成员变量: public $users public $userName 私有成员变量: private $_user private $_

yii自动登录

在yii,登录页面选择记住密码,下次就会自动登陆 前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面 自动登录是利用cookie实现的 配置User组件 首先在配置文件的components中设置user组件 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, 'idParam' => '__check', 'identit