YII:CAccessControlFilter

CAccessRule 的 isUserMatched

protected function isUserMatched($user) { if(empty($this->users)) return true; foreach($this->users as $u) { if($u==='*') return true; elseif($u==='?' && $user->getIsGuest()) return true; elseif($u==='@' && !$user->getIsGuest()) return true; elseif(!strcasecmp($u,$user->getName())) return true; } return false; }

理解:
1.*:代表任何人,返回true;
2.?:代表游客清蚀,當(dāng)__id===null返回true汞舱;
3.@:代表非游客耿戚,當(dāng)__id!=null返回true瞳收;
4.$u:代表用戶名涮阔,當(dāng)__name==$u返回true叮盘。


CAccessRule 的 isUserAllowed

public function isUserAllowed($user,$controller,$action,$ip,$verb) { if($this->isActionMatched($action) && $this->isUserMatched($user) && $this->isRoleMatched($user) && $this->isIpMatched($ip) && $this->isVerbMatched($verb) && $this->isControllerMatched($controller) && $this->isExpressionMatched($user)) return $this->allow ? 1 : -1; else return 0; }

理解:
1.不符合匹配時(shí)返回0秩贰;
2.符合匹配并且是允許時(shí)返回1;
3.符合匹配并且是拒絕時(shí)返回-1柔吼;


CAccessControlFilter 的 preFilter

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; elseif($allow<0) // denied { if(isset($rule->deniedCallback)) call_user_func($rule->deniedCallback, $rule); else $this->accessDenied($user,$this->resolveErrorMessage($rule)); return false; } } return true; }

理解:
1.當(dāng)遇到一個(gè)規(guī)則返回1時(shí)毒费,則不匹配后面的規(guī)則,過濾器立即返回true嚷堡;
2.支持自定義拒絕回調(diào)蝗罗。


Controller

class SiteController extends CController
{
    
    public function filters()
    {
        return array(
                'accessControl', // perform access control for CRUD operations
        );
    }
    
    public function accessRules()
    {
        return array(
                array('allow',  // allow all users to access 'index' and 'view' actions.
                        'actions'=>array('login'),
                        'users'=>array('*'),
                ),
                array('allow', // allow authenticated users to access all actions
                        'users'=>array('@'),
                ),
                array('deny',  // deny all users
                        'users'=>array('*'),
                ),
        );
    }
    
    public function deniedCallback()
    {
        echo '<pre>';
        var_dump(func_get_args());
    }
    
    public function actionIndex()
    {
        //TODO
    }
    
    public function actionLogin()
    {
        //TODO
    }
}

實(shí)踐:
1.當(dāng)訪問login時(shí)(不論登錄狀態(tài)如何),第一個(gè)規(guī)則返回1蝌戒,跳過后兩個(gè)規(guī)則串塑,過濾器立即返回true;
2.當(dāng)用戶未登錄時(shí)訪問index北苟,第一個(gè)規(guī)則返回0桩匪,接著第二個(gè)規(guī)則非游客返回0,最后第三個(gè)規(guī)則返回-1友鼻,過濾器回調(diào)自定義的拒絕回調(diào)函數(shù)并返回false;
3.當(dāng)用戶未登錄時(shí)訪問index傻昙,第一個(gè)規(guī)則返回0,接著第二個(gè)規(guī)則非游客返回1彩扔,跳過第三個(gè)規(guī)則妆档,過濾器立即返回true;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虫碉,隨后出現(xiàn)的幾起案子贾惦,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件须板,死亡現(xiàn)場(chǎng)離奇詭異碰镜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)习瑰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門绪颖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甜奄,你說我怎么就攤上這事柠横。” “怎么了课兄?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵滓鸠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我第喳,道長(zhǎng)糜俗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任曲饱,我火速辦了婚禮悠抹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扩淀。我一直安慰自己楔敌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布驻谆。 她就那樣靜靜地躺著卵凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胜臊。 梳的紋絲不亂的頭發(fā)上勺卢,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音象对,去河邊找鬼黑忱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛勒魔,可吹牛的內(nèi)容都是我干的甫煞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼冠绢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抚吠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弟胀,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤楷力,失蹤者是張志新(化名)和其女友劉穎蕊玷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弥雹,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年延届,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剪勿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡方庭,死狀恐怖厕吉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情械念,我是刑警寧澤头朱,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站龄减,受9級(jí)特大地震影響项钮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜希停,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一烁巫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宠能,春花似錦亚隙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至羞延,卻和暖如春渣淳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴箩。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工水由, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赛蔫。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓砂客,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呵恢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鞠值,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容