亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

我有一個非常大的問題?。?/h1>

在User控制器中有一個actionVlogin方法,這個方法主要的功能是檢查Url的參數并設置cookie的。然而User控制器時繼承Base控制的,base控制器中有個beforeAction方法,這個方法主要的作用是檢查權限,并且在所有繼承Base控制器的控制器里面的所有方法之前執行。

我的問題是:既然User控制器時繼承Base控制器的,所以User控制器里面的actionVlogin方法在beforeAction方法之后執行。

當我們在導航條敲下/User/Vlogin?uid=1時,先跑的是beforeAction方法,此刻還沒有跑到actionVlogin方法。因為是有先后順序的,所以在

跑到beforeAction方法時,Cookie還沒有進行設置(Cookie在actionVlogin方法設置)。所以你在beforeAction方法里面的所有檢查都好像是

徒勞的,因為此時并沒有Cookie。然而你把全部代碼都寫完權限功能卻是好用的,為什么?是我理解錯了嗎?


求大神指教~~


求大神指教~~求大神指教~~

正在回答

2 回答

BaseController的beforeAction()可以看做有三個功能:

  1. 登錄狀態校驗。?

    注意到beforeAction()的開始幾句:

???$login_status?=?$this->checkLoginStatus();
???if?(?!$login_status?&&?!in_array(?$action->uniqueId,$this->allowAllAction?)??)?{
???????if(Yii::$app->request->isAjax){
???????????$this->renderJSON([],"未登錄,請返回用戶中心",-302);
???????}else{
???????????$this->redirect(?UrlService::buildUrl("/user/login")?);//返回到登錄頁面
???????}
???????return?false;
???}

邏輯是:如果用戶已經登錄(有cookie), 則獲取用戶的權限列表; 如果沒有登錄,則重定向到登錄模塊(也就是說User的Vlogin())。

但是

!in_array(?$action->uniqueId,$this->allowAllAction?)

時排除了login和vlogin兩個方法的,也就是說訪問vlogin時,不會進入到這塊的判斷跳轉。所以繼續向下執行。

?2. 記錄到訪問日志。

也就是說`$model_log`處理的那一段。[直接寫入,不需要校驗]

3. 驗證訪問權限。

if(?!$this->checkPrivilege(?$action->getUniqueId()?)?){????
????$this->redirect(?UrlService::buildUrl(?"/error/forbidden"?)?);????
????return?false;????
}

但是 checkPrivilege()方法有下面一段:

if(?in_array(?$url,$this->ignore_url?)?){????
????return?true;????
}

所以vlogin()的訪問權限也不會進行校驗。


所以,綜上,訪問Vlogin()時,beforeAction()的作用僅僅是記錄訪問日志,并沒有什么關于cookie的校驗,所以也不存在徒勞之說。

1 回復 有任何疑惑可以回復我~

。。。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
RBAC打造通用web管理權限
  • 參與學習       20509    人
  • 解答問題       51    個

RBAC為商業系統安全防范手段,結合理論和實戰介紹RBAC

進入課程

我有一個非常大的問題?。?/h1> 我要回答 關注問題

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號