CPhpAuthManager
优质
小牛编辑
134浏览
2023-12-01
所有包 | 属性 | 方法
CPhpAuthManager代表授权信息存储在一个PHP文件的授权管理器。
授权数据在指定的文件authFile 里面保存/加载, 默认是’protected/data/auth.php‘。
CPhpAuthManager主要是应用在授权数据不多的情况下 (如,个人博客系统的授权信息)。 如果是比较复杂的授权数据,应该使用CDbAuthManager。
源码: framework/web/auth/CPhpAuthManager.php#98 (显示)
源码: framework/web/auth/CPhpAuthManager.php#174 (显示)
源码: framework/web/auth/CPhpAuthManager.php#66 (显示)
源码: framework/web/auth/CPhpAuthManager.php#444 (显示)
源码: framework/web/auth/CPhpAuthManager.php#454 (显示)
源码: framework/web/auth/CPhpAuthManager.php#284 (显示)
源码: framework/web/auth/CPhpAuthManager.php#465 (显示)
源码: framework/web/auth/CPhpAuthManager.php#220 (显示)
源码: framework/web/auth/CPhpAuthManager.php#231 (显示)
源码: framework/web/auth/CPhpAuthManager.php#316 (显示)
源码: framework/web/auth/CPhpAuthManager.php#244 (显示)
源码: framework/web/auth/CPhpAuthManager.php#150 (显示)
源码: framework/web/auth/CPhpAuthManager.php#139 (显示)
源码: framework/web/auth/CPhpAuthManager.php#49 (显示)
源码: framework/web/auth/CPhpAuthManager.php#208 (显示)
源码: framework/web/auth/CPhpAuthManager.php#412 (显示)
源码: framework/web/auth/CPhpAuthManager.php#486 (显示)
源码: framework/web/auth/CPhpAuthManager.php#296 (显示)
源码: framework/web/auth/CPhpAuthManager.php#122 (显示)
源码: framework/web/auth/CPhpAuthManager.php#191 (显示)
源码: framework/web/auth/CPhpAuthManager.php#374 (显示)
源码: framework/web/auth/CPhpAuthManager.php#365 (显示)
源码: framework/web/auth/CPhpAuthManager.php#326 (显示)
源码: framework/web/auth/CPhpAuthManager.php#500 (显示)
包 | system.web.auth |
---|---|
继承 | class CPhpAuthManager » CAuthManager » CApplicationComponent » CComponent |
实现 | IAuthManager, IApplicationComponent |
源自 | 1.0 |
版本 | $Id: CPhpAuthManager.php 3515 2011-12-28 12:29:24Z mdomba $ |
源码 | framework/web/auth/CPhpAuthManager.php |
授权数据在指定的文件authFile 里面保存/加载, 默认是’protected/data/auth.php‘。
CPhpAuthManager主要是应用在授权数据不多的情况下 (如,个人博客系统的授权信息)。 如果是比较复杂的授权数据,应该使用CDbAuthManager。
公共属性
隐藏继承属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
authFile | string | 包含授权数据的PHP文件路径。 如果没有设置,它会使用‘protected/data/auth. | CPhpAuthManager |
authItems | array | 返回指定类型和用户的授权项目。 | CPhpAuthManager |
behaviors | array | 这个应用组件附加的行为。 这此行为将在应用组件调用init时附加在应用组件上。 请参照CModel::behaviors如何指定此属性值。 | CApplicationComponent |
defaultRoles | array | 隐式赋予给所有用户的角色名字列表。 这些角色不需要显式赋予给所有用户。 当调用checkAccess,会首先检查这些角色。 为了能够提高程序效率,这样的角色越少越好。 一个典型的用法是,定义一个“authenticated”角色,然后 把它关联到一个业务逻辑规则,这个规则是用来验证当前用户的。 然后在这个属性声明“authenticated”以便应用到 所有的验证用户。 | CAuthManager |
isInitialized | boolean | 检查应用组件是否已经初始化。 | CApplicationComponent |
operations | array | 返回操作。 | CAuthManager |
roles | array | 返回角色。 | CAuthManager |
showErrors | boolean | 允许业务规则错误报告。 | CAuthManager |
tasks | array | 返回任务。 | CAuthManager |
公共方法
隐藏继承方法
方法 | 描述 | 定义在 |
---|---|---|
__call() | 如果类中没有调的方法名,则调用这个方法。 | CComponent |
__get() | 返回一个属性值、一个事件处理程序列表或一个行为名称。 | CComponent |
__isset() | 检查一个属性是否为null。 | CComponent |
__set() | 设置一个组件的属性值。 | CComponent |
__unset() | 设置一个组件的属性为null。 | CComponent |
addItemChild() | 添加一个授权项目作为另一个授权项的子授权项目。 | CPhpAuthManager |
asa() | 返回这个名字的行为对象。 | CComponent |
assign() | 为用户分配一个授权项目。 | CPhpAuthManager |
attachBehavior() | 附加一个行为到组件。 | CComponent |
attachBehaviors() | 附加一个行为列表到组件。 | CComponent |
attachEventHandler() | 为事件附加一个事件处理程序。 | CComponent |
canGetProperty() | 确定属性是否可读。 | CComponent |
canSetProperty() | 确定属性是否可写。 | CComponent |
checkAccess() | 检查指定用户的执行权限。 | CPhpAuthManager |
clearAll() | 移除所有授权数据。 | CPhpAuthManager |
clearAuthAssignments() | 移除所有授权分配信息。 | CPhpAuthManager |
createAuthItem() | 创建一个授权项目。 | CPhpAuthManager |
createOperation() | 创建一个操作。 | CAuthManager |
createRole() | 创建一个角色。 | CAuthManager |
createTask() | 创建一个任务。 | CAuthManager |
detachBehavior() | 从组件中分离一个行为。 | CComponent |
detachBehaviors() | 从组件中分离所有行为。 | CComponent |
detachEventHandler() | 分离一个存在的事件处理程序。 | CComponent |
disableBehavior() | 禁用一个附加行为。 | CComponent |
disableBehaviors() | 禁用组件附加的所有行为。 | CComponent |
enableBehavior() | 启用一个附加行为。 | CComponent |
enableBehaviors() | 启用组件附加的所有行为。 | CComponent |
evaluateExpression() | 计算一个PHP表达式,或根据组件上下文执行回调。 | CComponent |
executeBizRule() | 执行指定的业务规则。 | CAuthManager |
getAuthAssignment() | 返回项目任务信息。 | CPhpAuthManager |
getAuthAssignments() | 返回指定用户的项目任务。 | CPhpAuthManager |
getAuthItem() | 返回指定名字的授权项目。 | CPhpAuthManager |
getAuthItems() | 返回指定类型和用户的授权项目。 | CPhpAuthManager |
getEventHandlers() | 返回一个事件的附加处理程序列表。 | CComponent |
getIsInitialized() | 检查应用组件是否已经初始化。 | CApplicationComponent |
getItemChildren() | 返回指定项目的子项目 | CPhpAuthManager |
getOperations() | 返回操作。 | CAuthManager |
getRoles() | 返回角色。 | CAuthManager |
getTasks() | 返回任务。 | CAuthManager |
hasEvent() | 确定一个事件是否定义。 | CComponent |
hasEventHandler() | 检查事件是否有附加的处理程序。 | CComponent |
hasItemChild() | 返回值说明父授权项目是否包含子授权项目。 | CPhpAuthManager |
hasProperty() | 确定属性是否被定义。 | CComponent |
init() | 初始化应用组件。 | CPhpAuthManager |
isAssigned() | 返回值说明这个项目是否已经赋予给用户。 | CPhpAuthManager |
load() | 加载授权数据。 | CPhpAuthManager |
raiseEvent() | 发起一个事件。 | CComponent |
removeAuthItem() | 移除指定的授权项目。 | CPhpAuthManager |
removeItemChild() | 移除子项目。 | CPhpAuthManager |
revoke() | 撤消用户的授权任务。 | CPhpAuthManager |
save() | 将授权数据保存到持久化存储器。 | CPhpAuthManager |
saveAuthAssignment() | 保存修改的授权信息。 | CPhpAuthManager |
saveAuthItem() | 将授权项目保存到持久化存储器。 | CPhpAuthManager |
受保护方法
隐藏继承方法
方法 | 描述 | 定义在 |
---|---|---|
checkItemChildType() | 检查项目类型以确定一个子项目已经赋予给一个父项目。 | CAuthManager |
detectLoop() | 检查授权项目层级是否存在循环。 | CPhpAuthManager |
loadFromFile() | 从PHP文件加载授权数据。 | CPhpAuthManager |
saveToFile() | 保存授权数据到PHP文件。 | CPhpAuthManager |
属性详细
authFile 属性 public string $authFile;包含授权数据的PHP文件路径。 如果没有设置,它会使用‘protected/data/auth.php’作为数据文件。 如果需要修改授权数据,要确保网络服务进程对该文件 有写的权限。
参见
- loadFromFile
- saveToFile
返回指定类型和用户的授权项目。
方法详细
addItemChild() 方法public boolean addItemChild(string $itemName, string $childName) | ||
$itemName | string | 父项目名字 |
$childName | string | 子项目名字 |
{return} | boolean | 是否添加成功 |
publicfunctionaddItemChild($itemName,$childName)
{
if(!isset($this->_items[$childName],$this->_items[$itemName]))
thrownewCException(Yii::t('yii','Either"{parent}"or"{child}"doesnotexist.',array('{child}'=>$childName,'{name}'=>$itemName)));
$child=$this->_items[$childName];
$item=$this->_items[$itemName];
$this->checkItemChildType($item->getType(),$child->getType());
if($this->detectLoop($itemName,$childName))
thrownewCException(Yii::t('yii','Cannotadd"{child}"asachildof"{parent}".Aloophasbeendetected.',
array('{child}'=>$childName,'{parent}'=>$itemName)));
if(isset($this->_children[$itemName][$childName]))
thrownewCException(Yii::t('yii','Theitem"{parent}"alreadyhasachild"{child}".',
array('{child}'=>$childName,'{parent}'=>$itemName)));
$this->_children[$itemName][$childName]=$this->_items[$childName];
returntrue;
}
添加一个授权项目作为另一个授权项的子授权项目。
assign() 方法public CAuthAssignment assign(string $itemName, mixed $userId, string $bizRule=NULL, mixed $data=NULL) | ||
$itemName | string | 项目名字 |
$userId | mixed | 用户ID(详情请参考IWebUser::getId) |
$bizRule | string | 当调用checkAccess时, 具体的授权项目的业务规则。 |
$data | mixed | 这个任务额外的数据。 |
{return} | CAuthAssignment | 授权任务的信息。 |
publicfunctionassign($itemName,$userId,$bizRule=null,$data=null)
{
if(!isset($this->_items[$itemName]))
thrownewCException(Yii::t('yii','Unknownauthorizationitem"{name}".',array('{name}'=>$itemName)));
elseif(isset($this->_assignments[$userId][$itemName]))
thrownewCException(Yii::t('yii','Authorizationitem"{item}"hasalreadybeenassignedtouser"{user}".',
array('{item}'=>$itemName,'{user}'=>$userId)));
else
return$this->_assignments[$userId][$itemName]=newCAuthAssignment($this,$itemName,$userId,$bizRule,$data);
}
为用户分配一个授权项目。
checkAccess() 方法public boolean checkAccess(string $itemName, mixed $userId, array $params=array ( )) | ||
$itemName | string | 需要权限检查的授权项名称 |
$userId | mixed | 用户ID。它应该是一个整数或一个字符串,代表用户的唯一标识 详情请参考IWebUser::getId。 |
$params | array | 分配给用户的任务或角色的 (键-值对)形式的业务规则。 |
{return} | boolean | 用户是否有权执行操作。 |
publicfunctioncheckAccess($itemName,$userId,$params=array())
{
if(!isset($this->_items[$itemName]))
returnfalse;
$item=$this->_items[$itemName];
Yii::trace('Checkingpermission"'.$item->getName().'"','system.web.auth.CPhpAuthManager');
if($this->executeBizRule($item->getBizRule(),$params,$item->getData()))
{
if(in_array($itemName,$this->defaultRoles))
returntrue;
if(isset($this->_assignments[$userId][$itemName]))
{
$assignment=$this->_assignments[$userId][$itemName];
if($this->executeBizRule($assignment->getBizRule(),$params,$assignment->getData()))
returntrue;
}
foreach($this->_childrenas$parentName=>$children)
{
if(isset($children[$itemName])&&$this->checkAccess($parentName,$userId,$params))
returntrue;
}
}
returnfalse;
}
检查指定用户的执行权限。
clearAll() 方法public void clearAll() |
publicfunctionclearAll()
{
$this->clearAuthAssignments();
$this->_children=array();
$this->_items=array();
}
移除所有授权数据。
clearAuthAssignments() 方法public void clearAuthAssignments() |
publicfunctionclearAuthAssignments()
{
$this->_assignments=array();
}
移除所有授权分配信息。
createAuthItem() 方法public CAuthItem createAuthItem(string $name, integer $type, string $description='', string $bizRule=NULL, mixed $data=NULL) | ||
$name | string | 项目名字。这个一个是唯一标识。 |
$type | integer | 项目类型(0:操作,1:任务,2:角色)。 |
$description | string | 项目描述 |
$bizRule | string | 关联到项目的业务规则。这里是PHP代码段,当调用checkAccess时 会执行。 |
$data | mixed | 项目关联的额外数据。 |
{return} | CAuthItem | 授权项目 |
publicfunctioncreateAuthItem($name,$type,$description='',$bizRule=null,$data=null)
{
if(isset($this->_items[$name]))
thrownewCException(Yii::t('yii','Unabletoaddanitemwhosenameisthesameasanexistingitem.'));
return$this->_items[$name]=newCAuthItem($this,$name,$type,$description,$bizRule,$data);
}
创建一个授权项目。 代表动作权限的授权项目(如,创建一个内容)。 它有三种类型:操作,任务,角色。 层级授权项目。高层项目继承 低层项目的权限。
detectLoop() 方法protected boolean detectLoop(string $itemName, string $childName) | ||
$itemName | string | 父项目名字 |
$childName | string | 要添加到层级的子项目名字。 |
{return} | boolean | 返回这个循环是否存在。 |
protectedfunctiondetectLoop($itemName,$childName)
{
if($childName===$itemName)
returntrue;
if(!isset($this->_children[$childName],$this->_items[$itemName]))
returnfalse;
foreach($this->_children[$childName]as$child)
{
if($this->detectLoop($itemName,$child->getName()))
returntrue;
}
returnfalse;
}
检查授权项目层级是否存在循环。
getAuthAssignment() 方法public CAuthAssignment getAuthAssignment(string $itemName, mixed $userId) | ||
$itemName | string | 项目名字 |
$userId | mixed | 用户ID(详情请参考IWebUser::getId)。 |
{return} | CAuthAssignment | 项目任务信息。如果没有赋予给用户, 则返回null。 |
publicfunctiongetAuthAssignment($itemName,$userId)
{
returnisset($this->_assignments[$userId][$itemName])?$this->_assignments[$userId][$itemName]:null;
}
返回项目任务信息。
getAuthAssignments() 方法public array getAuthAssignments(mixed $userId) | ||
$userId | mixed | 用户ID(详情请参考IWebUser::getId)。 |
{return} | array | 用户的项目任务信息。如果没有项目赋予给用户, 则返回null。 |
publicfunctiongetAuthAssignments($userId)
{
returnisset($this->_assignments[$userId])?$this->_assignments[$userId]:array();
}
返回指定用户的项目任务。
getAuthItem() 方法public CAuthItem getAuthItem(string $name) | ||
$name | string | 项目名字 |
{return} | CAuthItem | 授权项目。如果找不到该项目,则返回null。 |
publicfunctiongetAuthItem($name)
{
returnisset($this->_items[$name])?$this->_items[$name]:null;
}
返回指定名字的授权项目。
getAuthItems() 方法public array getAuthItems(integer $type=NULL, mixed $userId=NULL) | ||
$type | integer | 项目类型(0:操作,1:任务,2:角色)。默认为null, 意味着返回所有类型。 |
$userId | mixed | 用户ID。默认为null,意味着即使没有赋予给用户, 也返回所有的项目。 |
{return} | array | 指定类型的授权项目。 |
publicfunctiongetAuthItems($type=null,$userId=null)
{
if($type===null&&$userId===null)
return$this->_items;
$items=array();
if($userId===null)
{
foreach($this->_itemsas$name=>$item)
{
if($item->getType()==$type)
$items[$name]=$item;
}
}
elseif(isset($this->_assignments[$userId]))
{
foreach($this->_assignments[$userId]as$assignment)
{
$name=$assignment->getItemName();
if(isset($this->_items[$name])&&($type===null||$this->_items[$name]->getType()==$type))
$items[$name]=$this->_items[$name];
}
}
return$items;
}
返回指定类型和用户的授权项目。
getItemChildren() 方法public array getItemChildren(mixed $names) | ||
$names | mixed | 父项目名字。可以是字符串或者数组。 如果是后者,那么它是项目名字列表。 |
{return} | array | 父项目的所有子项目 |
publicfunctiongetItemChildren($names)
{
if(is_string($names))
returnisset($this->_children[$names])?$this->_children[$names]:array();
$children=array();
foreach($namesas$name)
{
if(isset($this->_children[$name]))
$children=array_merge($children,$this->_children[$name]);
}
return$children;
}
返回指定项目的子项目
hasItemChild() 方法public boolean hasItemChild(string $itemName, string $childName) | ||
$itemName | string | 父项目名字 |
$childName | string | 子项目名字 |
{return} | boolean | 子项目是否存在 |
publicfunctionhasItemChild($itemName,$childName)
{
returnisset($this->_children[$itemName][$childName]);
}
返回值说明父授权项目是否包含子授权项目。
init() 方法public void init() |
publicfunctioninit()
{
parent::init();
if($this->authFile===null)
$this->authFile=Yii::getPathOfAlias('application.data.auth').'.php';
$this->load();
}
初始化应用组件。 这个方法是覆盖父类的方法,从PHP文件 加载授权数据。
isAssigned() 方法public boolean isAssigned(string $itemName, mixed $userId) | ||
$itemName | string | 项目名字 |
$userId | mixed | 用户ID(详情请参考IWebUser::getId)。 |
{return} | boolean | 这个项目是否已经赋予给用户。 |
publicfunctionisAssigned($itemName,$userId)
{
returnisset($this->_assignments[$userId][$itemName]);
}
返回值说明这个项目是否已经赋予给用户。
load() 方法public void load() |
publicfunctionload()
{
$this->clearAll();
$items=$this->loadFromFile($this->authFile);
foreach($itemsas$name=>$item)
$this->_items[$name]=newCAuthItem($this,$name,$item['type'],$item['description'],$item['bizRule'],$item['data']);
foreach($itemsas$name=>$item)
{
if(isset($item['children']))
{
foreach($item['children']as$childName)
{
if(isset($this->_items[$childName]))
$this->_children[$name][$childName]=$this->_items[$childName];
}
}
if(isset($item['assignments']))
{
foreach($item['assignments']as$userId=>$assignment)
{
$this->_assignments[$userId][$name]=newCAuthAssignment($this,$name,$userId,$assignment['bizRule'],$assignment['data']);
}
}
}
}
加载授权数据。
loadFromFile() 方法protected array loadFromFile(string $file) | ||
$file | string | 文件路径。 |
{return} | array | 授权数据。 |
protectedfunctionloadFromFile($file)
{
if(is_file($file))
returnrequire($file);
else
returnarray();
}
从PHP文件加载授权数据。
参见
- saveToFile
public boolean removeAuthItem(string $name) | ||
$name | string | 要移除的项目名字 |
{return} | boolean | 存储器存在的项目是否已经移除成功。 |
publicfunctionremoveAuthItem($name)
{
if(isset($this->_items[$name]))
{
foreach($this->_childrenas&$children)
unset($children[$name]);
foreach($this->_assignmentsas&$assignments)
unset($assignments[$name]);
unset($this->_items[$name]);
returntrue;
}
else
returnfalse;
}
移除指定的授权项目。
removeItemChild() 方法public boolean removeItemChild(string $itemName, string $childName) | ||
$itemName | string | 父项目名字 |
$childName | string | 子项目名字 |
{return} | boolean | 是否删除成功 |
publicfunctionremoveItemChild($itemName,$childName)
{
if(isset($this->_children[$itemName][$childName]))
{
unset($this->_children[$itemName][$childName]);
returntrue;
}
else
returnfalse;
}
移除子项目。 要注意的是,子项目是没有被删除的。只是它跟父项目的关系解。
revoke() 方法public boolean revoke(string $itemName, mixed $userId) | ||
$itemName | string | 项目名字 |
$userId | mixed | 用户ID(详情请参考IWebUser::getId)。 |
{return} | boolean | 撤消是否成功 |
publicfunctionrevoke($itemName,$userId)
{
if(isset($this->_assignments[$userId][$itemName]))
{
unset($this->_assignments[$userId][$itemName]);
returntrue;
}
else
returnfalse;
}
撤消用户的授权任务。
save() 方法public void save() |
publicfunctionsave()
{
$items=array();
foreach($this->_itemsas$name=>$item)
{
$items[$name]=array(
'type'=>$item->getType(),
'description'=>$item->getDescription(),
'bizRule'=>$item->getBizRule(),
'data'=>$item->getData(),
);
if(isset($this->_children[$name]))
{
foreach($this->_children[$name]as$child)
$items[$name]['children'][]=$child->getName();
}
}
foreach($this->_assignmentsas$userId=>$assignments)
{
foreach($assignmentsas$name=>$assignment)
{
if(isset($items[$name]))
{
$items[$name]['assignments'][$userId]=array(
'bizRule'=>$assignment->getBizRule(),
'data'=>$assignment->getData(),
);
}
}
}
$this->saveToFile($items,$this->authFile);
}
将授权数据保存到持久化存储器。 如果授权数据有任何改变, 请确保你调用的这个方法能将改变数据保存到持久存储。
saveAuthAssignment() 方法public void saveAuthAssignment(CAuthAssignment $assignment) | ||
$assignment | CAuthAssignment | 已经修改的授权信息。 |
publicfunctionsaveAuthAssignment($assignment)
{
}
保存修改的授权信息。
saveAuthItem() 方法public void saveAuthItem(CAuthItem $item, string $oldName=NULL) | ||
$item | CAuthItem | 要保存的项目。 |
$oldName | string | 旧的项目名字。如果为null,意味着项目名字没有改变。 |
publicfunctionsaveAuthItem($item,$oldName=null)
{
if($oldName!==null&&($newName=$item->getName())!==$oldName)//namechanged
{
if(isset($this->_items[$newName]))
thrownewCException(Yii::t('yii','Unabletochangetheitemname.Thename"{name}"isalreadyusedbyanotheritem.',array('{name}'=>$newName)));
if(isset($this->_items[$oldName])&&$this->_items[$oldName]===$item)
{
unset($this->_items[$oldName]);
$this->_items[$newName]=$item;
if(isset($this->_children[$oldName]))
{
$this->_children[$newName]=$this->_children[$oldName];
unset($this->_children[$oldName]);
}
foreach($this->_childrenas&$children)
{
if(isset($children[$oldName]))
{
$children[$newName]=$children[$oldName];
unset($children[$oldName]);
}
}
foreach($this->_assignmentsas&$assignments)
{
if(isset($assignments[$oldName]))
{
$assignments[$newName]=$assignments[$oldName];
unset($assignments[$oldName]);
}
}
}
}
}
将授权项目保存到持久化存储器。
saveToFile() 方法protected void saveToFile(array $data, string $file) | ||
$data | array | 授权数据 |
$file | string | 文件路径。 |
protectedfunctionsaveToFile($data,$file)
{
file_put_contents($file,"<?phpnreturn".var_export($data,true).";n");
}
保存授权数据到PHP文件。
参见
- loadFromFile