您的位置:首页 > 编程语言 > PHP开发

YII 访问控制过了filters

2014-10-26 20:32 357 查看
系统后台:用户登录、后台首页面、商品列表、添加商品、修改商品

 

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

 

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

后台代码:

<?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";
}
}


还有关于权限控制srbac,有空再研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: