首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ThinkPHP _initialize 登錄攔截死循環:在初始化中排除登錄動作

     編輯:程式設計疑難解答

場景:模塊中有登錄及其他操作,未登錄用戶禁止訪問非登錄操作。在 _initialize 中判斷 Session,但登錄動作本身也會觸發 _initialize,導致死循環。

解決思路:動作名稱過濾

ThinkPHP 中可通過 ACTION_NAME 常量或 $this->actionName 獲取當前動作名,在 _initialize 中排除登錄相關動作。

代碼示例

public function _initialize() {
    // 定義無需登錄的動作列表
    $publicActions = ['login', 'verify', 'register', 'logout'];
    if (in_array(ACTION_NAME, $publicActions)) {
        return; // 直接返回,不做攔截
    }
    // 登錄驗證邏輯
    if (!session('?user')) {
        $this->error('請先登錄', U('login'));
    }
}

進階:基類控制器封裝

class BaseController extends Controller {
    protected $noAuthActions = [];
    public function _initialize() {
        if (!in_array(ACTION_NAME, $this->noAuthActions)) {
            if (!session('?user')) $this->redirect('Public/login');
        }
    }
}
class UserController extends BaseController {
    protected $noAuthActions = ['login', 'verify'];
    // ...
}

參考資源

ThinkPHP 官方討論:https://www.thinkphp.cn/topic/3244.html

核心原則:在入口處識別「公開動作」並放行,避免攔截器攔截自身登錄入口。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved