`
zccst
  • 浏览: 3315720 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Yii使用filter进行访问控制

    博客分类:
  • YII
 
阅读更多
Yii使用filter进行访问控制
作者:zccst

在Controller.php

注:filters是yii的CController.php中定义的方法,而Controller.php是继承CController.php的。此处,相当于覆盖父类中的filters方法。而所有的XXController.php又继承自Controller.php,显然都可以定义authlessActions()方法覆盖父类中相应方法。
public function filterAccessAuth($filterChain) {
		if(Yii::app()->user->getIsGuest() && !in_array($this->getAction()->getId(), $this->authlessActions())) {
			Yii::app()->user->setFlash("info", "请先登录");
			Yii::app()->user->loginRequired();  //封装了Yii::app()->user->loginUrl
		}
		elseif(!in_array($this->getAction()->getId(), $this->authlessActions()) && $this->current_user && $this->current_user->isPasswordExpired()) {
			$this->user->setFlash('error', "你的密码已经过期,超过: " . Yii::app()->params['user_pwd_max_expire_day'] . "天没有修改,请修改密码");
			$this->redirect($this->createUrl("/account/profile"));
		}
		
		if(!in_array($this->getAction()->getId(), $this->authlessActions()) && $this->current_user && $this->current_user->hi_id == NULL) {
			$target_url = $this->createUrl('account/profile');
			$this->user->setFlash('info', "你还没有设置Hi,请尽快到" . "<a href=\"$target_url\">  账号设置  </a>" . "添加!");	
		}

		$filterChain->run();
	}

	public function filters() {
		return array(
			'accessAuth',
		);
	}

	public function authlessActions() {
		return array();
	}

批注1:yii中使用filter规则。
For method-based filters, a method named 'filterXYZ($filterChain)' in the controller class will be executed, where 'XYZ' stands for the filter name as specified in filters(). Note, inside the filter method, you must call $filterChain->run() if the action should be executed. Otherwise, the filtering process would stop at this filter.





批注2:另一种用法(隐式用法)
在1.1.7中,public function filters() {
return array(
'accessControl',
);
}
也即accessControl对应下面这个方法
public void filterAccessControl(CFilterChain $filterChain)

The filter method for 'accessControl' filter. The filter method for 'accessControl' filter. This filter is a wrapper of CAccessControlFilter. To use this filter, you must override accessRules method.
class PostController extends CController
{
	......
	public function accessRules()
	{
		return array(
			rray('deny',
				'actions'=>array('create', 'edit'),
				'users'=>array('?'),
				),
			array('allow',
				'actions'=>array('delete'),
				'roles'=>array('admin'),
			),
			array('deny',
				'actions'=>array('delete'),
				'users'=>array('*'),
			),
		);
	}
}

所以不难看出filter至少有两种类型,一种是accessAuth,另一种是accessControl。



批注3:当用户访问index.php?r=site/login

首先,映射到SiteController.php中
而在SiteController.php中,覆盖了Controller.php的public function authlessActions()方法,不再是空数组,
而是return array('login', 'logout', 'error', 'page', 'bashJs');



批注4:在actionLogin方法里
		if(isset($_POST['LoginForm']))
		{
			$model->attributes=$_POST['LoginForm'];
			// validate user input and redirect to the previous page if valid
			if($model->validate() && $model->login()) {
				//初始化前,先初始化父类Controller.php的成员变量和成员函数。
				$this->init();

				// 检查上次密码修改时间
				if($this->current_user->isPasswordExpired()) {
					$this->user->setFlash('error', "密码已经" . Yii::app()->params['user_pwd_max_expire_day'] . "天没有修改过了,请修改密码");	
					$this->redirect($this->createUrl("/account/profile"));
				}
				
				// 检查有没有设置Hi
				if($this->current_user->hi_id == NULL) {
					$target_url = $this->createUrl('account/profile');
					$this->user->setFlash('info', "你还没有设置Hi,请尽快到"."<a href=\"$target_url\">  账号设置  </a>"."添加!");	
				}

				$this->redirect(Yii::app()->user->returnUrl);
			}
		}

根据最前面的方法in_array($this->getAction()->getId(), $this->authlessActions())可以判断该action是否在不用授权数组中。

注:查看当前controller和action的ID,是Yii::app()->controller->id;和$this->getAction()->getId();
其中,$this->getAction()是一个很大的对象,$this->getAction()->getId()是login。



批注5:关于未登录前,应该走下面这个逻辑
if(Yii::app()->user->getIsGuest() && !in_array($this->getAction()->getId(), $this->authlessActions())) {
			Yii::app()->user->setFlash("info", "请先登录");
			Yii::app()->user->loginRequired();  //封装了Yii::app()->user->loginUrl
		}

根据yii框架实现机制,发现Yii::app()->user->loginRequired()封装了Yii::app()->user->loginUrl。
即注释掉改行后,project/不会自动跳转到project/index.php?r=site/login页面。



最后,如果用户登陆成功后,用户跳转到site/index,而其定义为outsource/index,当OutsourceController.php执行时,又一次执行Controller.php,此时的authlessActions数组为空,则in_array()为false,取反为true。执行检查上次修改密码超过30天和是否已添加Hi。


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    YII Framework的filter过滤器用法分析

    YII框架中的filter过滤器是该框架提供的一个强大功能,它允许开发者在控制器动作执行之前或之后执行一段自定义的代码,用以完成如访问控制、性能监控、数据验证等任务。过滤器的实现方式可以是通过控制器类中的特定...

    YII srbac_1.3

    - **可扩展性**:支持自定义规则,可以根据业务需求添加复杂的访问控制逻辑。 - **版本更新**:`1.3beta` 表示这是该插件的一个测试版本,可能包含一些新功能和改进,同时也可能存在一些已知问题。 4. **安装与...

    yii-1.0.4.r920

    它还支持用户认证和授权机制,如访问控制过滤器(Access Control Filter)。 7. 表单和验证:Yii 提供了方便的表单处理和数据验证工具,可以快速创建和验证用户输入,减少错误和安全风险。 8. 视图助手:Yii 视图...

    Yii控制器中filter过滤器用法分析

    例如,本文中的"filters"方法定义了三个过滤规则:"accessControl"用于执行CRUD操作的访问控制,"postOnly+delete"表示只允许通过POST请求进行删除操作,"projectContext+createindexadmin"表示在创建、列表、管理...

    YII快速入门教程

    - 通过URL访问模块中的控制器和动作。 **9. 路径别名** - **定义**: 用于简化文件路径的引用方式。 - **用途**: 方便维护文件路径,避免硬编码路径带来的问题。 **10. 开发规范** - **URL**: 设计友好的URL。 -...

    深入解析yii权限分级式访问控制的实现(非RBAC法)

    3. 修改accessRules()方法,将之前硬编码分配用户权限的方式改为根据数据库中用户的角色信息来进行访问控制。比如,修改原有的'users'参数为一个数组,使用用户角色字段来匹配具体的访问权限。 文章中的这部分说明...

    PHP的Yii框架中过滤器相关的使用总结

    开发者可以在这些方法中加入自己的逻辑处理代码,比如记录日志、进行访问控制检查等。 过滤器也可以阻止动作和后续其他过滤器的执行。如果在preFilter方法中返回false,则动作不会执行,且postFilter方法不会被调用...

    yii快速入门教程--一个非常好的php框架

    - **使用事务**: 使用`beginTransaction()`和`commit()`或`rollBack()`进行事务处理。 - **绑定参数**: 通过`bindValue()`方法绑定参数到SQL语句。 - **使用表前缀**: 在数据库连接配置中设置表前缀。 **2. ...

    Yii2的基本应用程序模板 yii-basic-app-2.0.12

    - 授权可通过访问控制过滤器(Access Control Filter, ACF)或角色基础访问控制(Role-Based Access Control, RBAC)进行。 8. **错误处理和日志记录**: - 错误和异常处理机制,便于调试和生产环境的错误报告。 ...

    yii2.0中文手册

    - 授权则可以通过访问控制过滤器(Access Control Filter, ACF)和角色基础访问控制(Role-Based Access Control, RBAC)来实现。 7. **缓存管理**: - Yii 2.0 支持多种缓存策略,如文件、数据库、APC等,可以...

    Yii快速入门手册

    在Yii框架中,创建应用实例并运行它时,可以使用Yii::app()方法访问应用实例。这通常在应用的任何位置进行,比如在控制器、视图或其他地方。 总体来说,Yii框架设计上遵循了MVC(Model-View-Controller)模式,这有...

    使用Yii框架实现Django教程中的mysite项目-一个简单的投票网站。.zip

    对于投票,可能需要限制每个用户只能投一票,这可以通过访问控制过滤器(Access Control Filter, ACF)实现。 9. **表单处理** 使用Yii的CForm或ActiveForm类创建投票表单,处理用户的提交。在控制器中验证输入,...

    yii 掌上药店

    - Yii 的访问控制过滤器(Access Control Filter, ACF)可以帮助设置角色和权限,实现基于角色的访问控制(RBAC)。 - 输入验证:Yii 提供了丰富的表单验证规则,确保用户输入的安全性。 8. **部署与扩展**: - ...

    在yii中新增一个用户验证的方法详解

    在Yii中,这可以通过访问控制过滤器(Access Control Filter, ACF)实现。 例如,下面是一个简单的带有访问控制的Controller: ```php class AdminDefaultController extends CController { public function ...

    Yii Practical Reference

    - Yii DAO(数据访问对象)接口允许直接执行 SQL 查询和操作。 - 建立数据库连接,如使用 `CDbConnection` 作为应用组件。 - 执行 SQL 语句,获取查询结果,使用事务处理,绑定参数和列,设置表前缀,使用查询...

Global site tag (gtag.js) - Google Analytics