CAccessControlFilter


system.web.auth
继承 class CAccessControlFilter » CFilter » CComponent
实现 IFilter
源自 1.0
版本 $Id: CAccessControlFilter.php 3515 2011-12-28 12:29:24Z mdomba $
源码
CAccessControlFilter执行指定的授权检查操作。

通过启用此过滤器,控制器的动作执行的时候会检查权限。 当用户确认通过一个安全规则或允许一个明确的规则时, 他就可以执行此动作。

为了更高的安全性,可以考虑增加如下代码:
array('deny')
使用上述的规则后,默认情况下会拒绝所有的动作。

可以通过设置rules属性来指定访问规则, 这些规则应该是一个数组,每个指定的规则是这个数组中的一个元素。如下所示:
array(
  'allow',  // or 'deny'
  //可选规则,本规则适用于列出的所有动作ID(不区分大小写)
  //如果未指定此项,则规则适用于所有动作。
  'actions'=>array('edit', 'delete'),
  //可选规则,本规则适用于列出的所有控制器ID(不区分大小写)
  'controllers'=>array('post', 'admin/user'),
  //可选规则,本规则适用于列出的所有用户ID(不区分大小写)
  //使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。
  'users'=>array('thomas', 'kevin'),
  //可选规则,本规则适用于列出的所有角色(区分大小写)。
  'roles'=>array('admin', 'editor'),
  //可选规则,本规则适用于列出的所有IP地址。
  //如127.0.0.1, 127.0.0.*
  'ips'=>array('127.0.0.1'),
  //可选规则,本规则适用于列出的所有请求类型(区分大小写)。
  'verbs'=>array('GET', 'POST'),
  //可选规则,一个PHP表达式,其值表示此规则是否适用
  'expression'=>'!$user->isGuest && $user->level==2',
  //可选规则,显示自定义的错误消息
  //自1.1.1版后,此选项开始使用。
  'message'=>'Access Denied.',
)

公共属性

属性 类型 描述 定义在
message string 授权失败时显示错误消息。 这个属性可以通过个别访问规则覆盖CAccessRule::message。 如果这个属性未被设置,则会显示默认的错误提示。 CAccessControlFilter
rules array 访问规则列表。 CAccessControlFilter

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
filter() 执行过滤。 CFilter
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getRules() 返回访问规则列表。 CAccessControlFilter
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
init() 初始化过滤器。 CFilter
raiseEvent() 发起一个事件。 CComponent
setRules() 设置访问规则列表。 CAccessControlFilter

受保护方法

方法 描述 定义在
accessDenied() 拒绝用户访问。 CAccessControlFilter
postFilter() 执行post操作过滤器。 CFilter
preFilter() 执行行动前的过滤。 CAccessControlFilter
resolveErrorMessage() 解析要显示的错误信息。 CAccessControlFilter

属性详细

message 属性 (可用自 v1.1.1)
public string $message;

授权失败时显示错误消息。 这个属性可以通过个别访问规则覆盖CAccessRule::message。 如果这个属性未被设置,则会显示默认的错误提示。

rules 属性
public array getRules()
public void setRules(array $rules)

访问规则列表。

方法详细

accessDenied() 方法
protected void accessDenied(IWebUser $user, string $message)
$user IWebUser 当前用户
$message string 要显示的错误信息
protected function accessDenied($user,$message)
{
    if(
$user->getIsGuest())
        
$user->loginRequired();
    else
        throw new 
CHttpException(403,$message);
}

拒绝用户访问。 访问检查失败时,调用此方法。

getRules() 方法
public array getRules()
{return} array 访问规则列表。
public function getRules()
{
    return 
$this->_rules;
}

preFilter() 方法
protected boolean preFilter(CFilterChain $filterChain)
$filterChain CFilterChain 已经开启的过滤器链
{return} boolean 过滤过程中是否应该继续 执行该动作。
protected function preFilter($filterChain)
{
    
$app=Yii::app();
    
$request=$app->getRequest();
    
$user=$app->getUser();
    
$verb=$request->getRequestType();
    
$ip=$request->getUserHostAddress();

    foreach(
$this->getRules() as $rule)
    {
        if((
$allow=$rule->isUserAllowed($user,$filterChain->controller,$filterChain->action,$ip,$verb))>0// allowed
            
break;
        else if(
$allow<0// denied
        
{
            
$this->accessDenied($user,$this->resolveErrorMessage($rule));
            return 
false;
        }
    }

    return 
true;
}

执行行动前的过滤。

resolveErrorMessage() 方法 (可用自 v1.1.1)
protected string resolveErrorMessage(CAccessRule $rule)
$rule CAccessRule 访问规则
{return} string 错误信息
protected function resolveErrorMessage($rule)
{
    if(
$rule->message!==null)
        return 
$rule->message;
    else if(
$this->message!==null)
        return 
$this->message;
    else
        return 
Yii::t('yii','You are not authorized to perform this action.');
}

解析要显示的错误信息。 这个方法会检查messageCAccessRule::message以确定 要显示什么内容的错误信息。

setRules() 方法
public void setRules(array $rules)
$rules array 访问规则列表。
public function setRules($rules)
{
    foreach(
$rules as $rule)
    {
        if(
is_array($rule) && isset($rule[0]))
        {
            
$r=new CAccessRule;
            
$r->allow=$rule[0]==='allow';
            foreach(
array_slice($rule,1) as $name=>$value)
            {
                if(
$name==='expression' || $name==='roles' || $name==='message')
                    
$r->$name=$value;
                else
                    
$r->$name=array_map('strtolower',$value);
            }
            
$this->_rules[]=$r;
        }
    }
}