CAccessControlFilter
| 鍖 | system.web.auth |
|---|---|
| 缁ф壙 | class CAccessControlFilter » CFilter » CComponent |
| 瀹炵幇 | IFilter |
| 婧愯嚜 | 1.0 |
| 鐗堟湰 | $Id: CAccessControlFilter.php 3515 2011-12-28 12:29:24Z mdomba $ |
| 婧愮爜 | framework/web/auth/CAccessControlFilter.php |
CAccessControlFilter鎵ц鎸囧畾鐨勬巿鏉冩鏌ユ搷浣溿
閫氳繃鍚敤姝よ繃婊ゅ櫒锛屾帶鍒跺櫒鐨勫姩浣滄墽琛岀殑鏃跺欎細妫鏌ユ潈闄愩 褰撶敤鎴风‘璁ら氳繃涓涓畨鍏ㄨ鍒欐垨鍏佽涓涓槑纭殑瑙勫垯鏃讹紝 浠栧氨鍙互鎵ц姝ゅ姩浣溿
涓轰簡鏇撮珮鐨勫畨鍏ㄦэ紝鍙互鑰冭檻澧炲姞濡備笅浠g爜锛
鍙互閫氳繃璁剧疆rules灞炴ф潵鎸囧畾璁块棶瑙勫垯锛 杩欎簺瑙勫垯搴旇鏄竴涓暟缁勶紝姣忎釜鎸囧畾鐨勮鍒欐槸杩欎釜鏁扮粍涓殑涓涓厓绱犮傚涓嬫墍绀猴細
閫氳繃鍚敤姝よ繃婊ゅ櫒锛屾帶鍒跺櫒鐨勫姩浣滄墽琛岀殑鏃跺欎細妫鏌ユ潈闄愩 褰撶敤鎴风‘璁ら氳繃涓涓畨鍏ㄨ鍒欐垨鍏佽涓涓槑纭殑瑙勫垯鏃讹紝 浠栧氨鍙互鎵ц姝ゅ姩浣溿
涓轰簡鏇撮珮鐨勫畨鍏ㄦэ紝鍙互鑰冭檻澧炲姞濡備笅浠g爜锛
array('deny')
浣跨敤涓婅堪鐨勮鍒欏悗锛岄粯璁ゆ儏鍐典笅浼氭嫆缁濇墍鏈夌殑鍔ㄤ綔銆
鍙互閫氳繃璁剧疆rules灞炴ф潵鎸囧畾璁块棶瑙勫垯锛 杩欎簺瑙勫垯搴旇鏄竴涓暟缁勶紝姣忎釜鎸囧畾鐨勮鍒欐槸杩欎釜鏁扮粍涓殑涓涓厓绱犮傚涓嬫墍绀猴細
array(
'allow', // or 'deny'
//鍙夎鍒欙紝鏈鍒欓傜敤浜庡垪鍑虹殑鎵鏈夊姩浣淚D锛堜笉鍖哄垎澶у皬鍐欙級
//濡傛灉鏈寚瀹氭椤癸紝鍒欒鍒欓傜敤浜庢墍鏈夊姩浣溿
'actions'=>array('edit', 'delete'),
//鍙夎鍒欙紝鏈鍒欓傜敤浜庡垪鍑虹殑鎵鏈夋帶鍒跺櫒ID锛堜笉鍖哄垎澶у皬鍐欙級
'controllers'=>array('post', 'admin/user'),
//鍙夎鍒欙紝鏈鍒欓傜敤浜庡垪鍑虹殑鎵鏈夌敤鎴稩D锛堜笉鍖哄垎澶у皬鍐欙級
//浣跨敤*鍙疯〃绀烘墍鏈夌敤鎴凤紝锛熷彿琛ㄧず鏉ュ鐢ㄦ埛锛孈琛ㄧず閫氳繃韬唤楠岃瘉鐨勭敤鎴枫
'users'=>array('thomas', 'kevin'),
//鍙夎鍒欙紝鏈鍒欓傜敤浜庡垪鍑虹殑鎵鏈夎鑹诧紙鍖哄垎澶у皬鍐欙級銆
'roles'=>array('admin', 'editor'),
//鍙夎鍒欙紝鏈鍒欓傜敤浜庡垪鍑虹殑鎵鏈塈P鍦板潃銆
//濡127.0.0.1, 127.0.0.*
'ips'=>array('127.0.0.1'),
//鍙夎鍒欙紝鏈鍒欓傜敤浜庡垪鍑虹殑鎵鏈夎姹傜被鍨嬶紙鍖哄垎澶у皬鍐欙級銆
'verbs'=>array('GET', 'POST'),
//鍙夎鍒欙紝涓涓狿HP琛ㄨ揪寮忥紝鍏跺艰〃绀烘瑙勫垯鏄惁閫傜敤
'expression'=>'!$user->isGuest && $user->level==2',
//鍙夎鍒欙紝鏄剧ず鑷畾涔夌殑閿欒娑堟伅
//鑷1.1.1鐗堝悗锛屾閫夐」寮濮嬩娇鐢ㄣ
'message'=>'Access Denied.',
)
鍏叡灞炴
| 灞炴 | 绫诲瀷 | 鎻忚堪 | 瀹氫箟鍦 |
|---|---|---|---|
| message | string | 鎺堟潈澶辫触鏃舵樉绀洪敊璇秷鎭 杩欎釜灞炴у彲浠ラ氳繃涓埆璁块棶瑙勫垯瑕嗙洊CAccessRule::message銆 濡傛灉杩欎釜灞炴ф湭琚缃紝鍒欎細鏄剧ず榛樿鐨勯敊璇彁绀恒 | CAccessControlFilter |
| rules | array | 璁块棶瑙勫垯鍒楄〃銆 | CAccessControlFilter |
鍏叡鏂规硶
鍙椾繚鎶ゆ柟娉
| 鏂规硶 | 鎻忚堪 | 瀹氫箟鍦 |
|---|---|---|
| accessDenied() | 鎷掔粷鐢ㄦ埛璁块棶銆 | CAccessControlFilter |
| postFilter() | 鎵цpost鎿嶄綔杩囨护鍣ㄣ | CFilter |
| preFilter() | 鎵ц琛屽姩鍓嶇殑杩囨护銆 | CAccessControlFilter |
| resolveErrorMessage() | 瑙f瀽瑕佹樉绀虹殑閿欒淇℃伅銆 | CAccessControlFilter |
灞炴ц缁
message
灞炴
锛堝彲鐢ㄨ嚜 v1.1.1锛
public string $message;
鎺堟潈澶辫触鏃舵樉绀洪敊璇秷鎭 杩欎釜灞炴у彲浠ラ氳繃涓埆璁块棶瑙勫垯瑕嗙洊CAccessRule::message銆 濡傛灉杩欎釜灞炴ф湭琚缃紝鍒欎細鏄剧ず榛樿鐨勯敊璇彁绀恒
rules
灞炴
璁块棶瑙勫垯鍒楄〃銆
鏂规硶璇︾粏
accessDenied()
鏂规硶
|
protected void accessDenied(IWebUser $user, string $message)
| ||
| $user | IWebUser | 褰撳墠鐢ㄦ埛 |
| $message | string | 瑕佹樉绀虹殑閿欒淇℃伅 |
婧愮爜锛 framework/web/auth/CAccessControlFilter.php#152 (鏄剧ず)
protected function accessDenied($user,$message)
{
if($user->getIsGuest())
$user->loginRequired();
else
throw new CHttpException(403,$message);
}
鎷掔粷鐢ㄦ埛璁块棶銆 璁块棶妫鏌ュけ璐ユ椂锛岃皟鐢ㄦ鏂规硶銆
getRules()
鏂规硶
|
public array getRules()
| ||
| {return} | array | 璁块棶瑙勫垯鍒楄〃銆 |
婧愮爜锛 framework/web/auth/CAccessControlFilter.php#72 (鏄剧ず)
public function getRules()
{
return $this->_rules;
}
preFilter()
鏂规硶
|
protected boolean preFilter(CFilterChain $filterChain)
| ||
| $filterChain | CFilterChain | 宸茬粡寮鍚殑杩囨护鍣ㄩ摼 |
| {return} | boolean | 杩囨护杩囩▼涓槸鍚﹀簲璇ョ户缁 鎵ц璇ュ姩浣溿 |
婧愮爜锛 framework/web/auth/CAccessControlFilter.php#106 (鏄剧ず)
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 | 閿欒淇℃伅 |
婧愮爜锛 framework/web/auth/CAccessControlFilter.php#136 (鏄剧ず)
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.');
}
瑙f瀽瑕佹樉绀虹殑閿欒淇℃伅銆 杩欎釜鏂规硶浼氭鏌message鍜CAccessRule::message浠ョ‘瀹 瑕佹樉绀轰粈涔堝唴瀹圭殑閿欒淇℃伅銆
setRules()
鏂规硶
|
public void setRules(array $rules)
| ||
| $rules | array | 璁块棶瑙勫垯鍒楄〃銆 |
婧愮爜锛 framework/web/auth/CAccessControlFilter.php#80 (鏄剧ず)
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;
}
}
}