CKFinder集成PHP后台认证配置报错,需拦截未登录用户访问上传页
嘿,我来帮你排查下为什么你的认证配置报错,还拦不住未登录用户。结合你的代码和常见的坑,大概率是这几个点没处理好:
Session没提前启动:PHP里用
$_SESSION之前必须调用session_start()啊!如果你的config.php里没启动会话,直接访问$_SESSION['session_admin']肯定会报"Undefined index"的错。你得在认证函数之前,或者整个config.php最顶部加上这个:session_start();注意哦,
session_start()必须在任何输出(哪怕是个空格、换行)之前调用,不然会触发"headers already sent"的错误,这个坑很多人踩过。直接访问未定义的Session键:你的代码里直接写
$_SESSION['session_admin'],但如果用户没登录,会话里根本就没有这个键,同样会报错。得先检查键存在,再判断值是否有效:$config['authentication'] = function() { // 先判断Session是否已经启动,没启动就启动 if (session_status() === PHP_SESSION_NONE) { session_start(); } // 先检查Cookie存在,或者Session键存在且值为有效状态(比如true/1) if(isset($_COOKIE['cookie_admin']) || (isset($_SESSION['session_admin']) && $_SESSION['session_admin'])){ return true; } else { return false; } };Cookie的路径/域名不匹配:如果你的
cookie_admin是后台登录时设置的,得确保它的路径(Path)和CKFinder所在的路径一致。比如后台和CKFinder都在根目录,Cookie路径要设为"/";如果CKFinder在子目录,Cookie路径得包含这个子目录,不然浏览器不会把Cookie发送给CKFinder的请求,自然就检查不到了。另外如果Cookie设了HttpOnly,前端拿不到但PHP的$_COOKIE是能读到的,这个不影响后端检查。框架会话冲突(如果用了框架的话):要是你的PHP后台用了Laravel、ThinkPHP这类框架,它们有自己的会话管理机制,直接在config.php里用原生
session_start()可能会和框架的会话冲突。这种情况下别用原生$_SESSION,改用框架提供的登录检查方法,比如Laravel里用auth()->check()就行。
要是还解决不了,把具体的报错信息贴出来,这样能更快定位问题~
内容的提问来源于stack exchange,提问作者Guy

