访问控制过滤器(Access?Control?Filter)
访问控制过滤器是检查当前用户是否能执行访问的controller?action的初步授权模式。
这种授权模式基于用户名,客户IP地址和访问类型。
访问控制过滤器,适用于简单的验证。
?
需要复杂的访问控制,需要使用将要讲解到的基于角色访问控制(role-based?access?(RBAC))。
在控制器(controller)里重载CController::filters方法,设置访问过滤器来控制访问动作(看?Filter?了解更多过滤器设置信息)。
class?PostController?extends?CController
{
......
public?function?filters()
????{
????????return?array(
????????????'accessControl',
????????);
????}
}
在上面,设置的access?control过滤器将应用于PostController里每个动作。
过滤器具体的授权规则通过重载控制器的CController::accessRules方法来指定。
class?PostController?extends?CController
{
????......
????public?function?accessRules()
????{
????????return?array(
????????????array('deny',
????????????????'actions'=>array('create',?'edit'),
????????????????'users'=>array('?'),
????????????),
????????????array('allow',
????????????????'actions'=>array('delete'),
????????????????'roles'=>array('admin'),
????????????),
????????????array('deny',
????????????????'actions'=>array('delete'),
????????????????'users'=>array('*'),
????????????),
????????);
????}
}
上面设定了三个规则,每个用个数组表示。
数组的第一个元素不是'allow'就是'deny',其他的是名-值成对形式设置规则参数的。
上面的规则这样理解:
create和edit动作不能被匿名执行;
delete动作可以被admin角色的用户执行;
delete动作不能被任何人执行。
访问规则是一个一个按照设定的顺序一个一个来执行判断的。
和当前判断模式(例如:用户名、角色、客户端IP、地址)相匹配的第一条规则决定授权的结果。
如果这个规则是allow,则动作可执行;
如果是deny,不能执行;如果没有规则匹配,动作可以执行。
?
为了确保某类动作在没允许情况下不被执行,设置一个匹配所有人的deny规则在最后,类似如下:
return?array(
????//?...?别的规则...
????//?以下匹配所有人规则拒绝'delete'动作
????array('deny',
????????'ac