核心功能:checklogin() 是什么?
checklogin() 的核心功能是验证当前用户是否已经登录,并返回用户的登录信息。

你可以把它想象成一个保安,当你(用户)进入一个需要权限的区域(如后台管理界面或会员中心)时,这个保安会检查你的“通行证”(Session/Cookie)是否有效,如果有效,他会让你通行,并告诉你的身份信息;如果无效,他会把你拦在外面。
在织梦CMS中,这个“通行证”就是存储在服务器 Session 中的用户信息。
函数定义与位置
checklogin() 函数通常位于 /include/helpers/login.helper.php 文件中,这是一个辅助函数文件,专门用来处理与登录相关的逻辑。
其基本定义如下:

/**
* 检查用户是否登录
*
* @param string $cookieVar 登录信息的Cookie变量名,默认为 'DedeUserID'
* @param string $cookieVar2 登录信息的Cookie变量名2,默认为 'DedeLoginTime'
* @return array|mixed 如果用户已登录,返回包含用户信息的数组;否则返回空数组或false。
*/
function checklogin($cookieVar = 'DedeUserID', $cookieVar2 = 'DedeLoginTime')
{
// ... 函数体 ...
}
工作原理详解
checklogin() 的工作流程可以分解为以下几个关键步骤:
从 Session 中获取用户信息
这是最核心的一步,织梦CMS在用户成功登录后,会将用户的ID、用户名、密码(MD5加密后的)、登录时间、权限等信息存储在 PHP 的 $_SESSION 全局变量中。
checklogin() 首先会尝试从这个 Session 中读取数据。
// 从 Session 中获取用户ID
$uid = isset($_SESSION[$cookieVar]) ? $_SESSION[$cookieVar] : 0;
// 从 Session 中获取登录时间
$logintime = isset($_SESSION[$cookieVar2]) ? $_SESSION[$cookieVar2] : 0;
// 如果用户ID为0,说明Session中没有登录信息
if ($uid == 0) {
return false;
}
处理“记住我”功能(Cookie辅助验证)
为了实现“记住我”功能,织梦CMS还会在用户浏览器中设置两个Cookie:

DedeUserID:存储用户ID。DedeLoginTime:存储用户登录的时间戳。
当 Session 过期或丢失时(比如浏览器重启),checklogin() 会检查这两个 Cookie 是否存在。
// 如果Session中没有,但Cookie中有,则尝试从Cookie中恢复Session
if ($uid == 0 && isset($_COOKIE[$cookieVar]) && isset($_COOKIE[$cookieVar2])) {
// 从Cookie中获取用户ID和登录时间
$uid = $_COOKIE[$cookieVar];
$logintime = $_COOKIE[$cookieVar2];
// 查询数据库,验证这个用户ID是否存在且状态正常
$row = $dsql->GetOne("SELECT * FROM `#@__admin` WHERE id='$uid' LIMIT 0,1");
if (is_array($row)) {
// 如果用户存在,则重新将信息写入Session,实现“自动登录”
$_SESSION[$cookieVar] = $uid;
$_SESSION[$cookieVar2] = $logintime;
// ... 返回用户信息 ...
} else {
// 如果用户不存在或被禁用,则清除Cookie
// ...
}
}
验证用户状态(数据库查询)
无论信息来自 Session 还是 Cookie,为了确保安全,checklogin() 通常会再次查询数据库,验证这个用户ID是否存在、是否被禁用、密码是否匹配等,这一步确保了即使 Session 或 Cookie 被篡改,也无法登录一个不存在的或被禁用的账户。
// 查询数据库获取用户完整信息
$row = $dsql->GetOne("SELECT * FROM `#@__admin` WHERE id='$uid' LIMIT 0,1");
// 如果查询结果不是数组,说明用户不存在或已被删除
if (!is_array($row)) {
// 清除Session和Cookie
// ...
return false;
}
// 可选:检查用户是否被禁用
if ($row['logintime'] == 0) {
// ...
return false;
}
返回结果
如果以上所有验证都通过,checklogin() 会返回一个包含用户详细信息的关联数组,这个数组通常包含以下键:
userid: 用户IDuname: 用户名pwd: 密码(MD5加密)tname: 用户类型(如 'admin')mtype: 会员类型(如果是会员登录)logintime: 登录时间rank: 用户权限等级
如果验证失败(如未登录、用户不存在、密码错误等),函数通常会返回 false 或一个空数组。
典型应用场景
checklogin() 函数在织梦CMS的许多地方被广泛调用。
后台登录验证
在后台管理界面的入口文件 dede/login.php 或其他需要权限的页面中,会首先调用 checklogin() 来判断管理员是否已登录。
// 在 dede/index.php (后台首页) 中
require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC."/helpers/login.helper.php");
// 检查登录状态
$adminuser = checklogin();
// 如果未登录,则跳转到登录页面
if (!isset($adminuser['userid'])) {
ShowMsg("您尚未登录,请先登录!", "login.php");
exit();
}
// 如果已登录,则正常显示后台页面
// ...
会员中心验证
在会员中心 /member/index.php 等页面,同样会使用 checklogin() 来验证会员身份。
// 在 member/index.php 中
require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC."/helpers/login.helper.php");
// 检查会员登录状态
$member = checklogin('memberID', 'dede_lm_id'); // 注意:会员登录的Cookie变量名不同
if (!isset($member['mid'])) {
// 未登录,跳转到会员登录页
header("location:login.php");
exit();
}
// 已登录,显示会员中心内容
// ...
自定义开发中的权限控制
如果你在开发织梦模板或插件时,某个功能需要登录才能访问,可以直接调用此函数。
<?php
require_once('include/helpers/login.helper.php');
$currentUser = checklogin();
if (!$currentUser) {
// 可以在这里输出一个提示,或者跳转到登录页
echo '<script>alert("请先登录!"); window.location.href="login.php";</script>';
exit();
}
// 只有登录用户才能看到的内容
echo "欢迎您," . $currentUser['uname'] . "!";
?>
注意事项
- 安全性:
checklogin()是第一道防线,但它的安全性依赖于 Session 和 Cookie 的正确配置,确保你的服务器环境安全,并防止 Session 固定攻击。 - Cookie变量名:管理员和会员的登录信息使用了不同的 Session/Cookie 变量名,管理员是
DedeUserID和DedeLoginTime,而会员通常是memberID和dede_lm_id,在调用时要注意区分。 - 函数返回值:始终要检查函数的返回值,而不要想当然地认为用户已登录。
if ($user = checklogin()) { ... }是一个很好的实践。 - 版本差异:不同版本的织梦CMS(如 5.7, 5.8),
checklogin()函数的具体实现细节可能略有不同,但其核心验证逻辑(Session -> Cookie -> Database)是基本一致的。
checklogin() 是织梦CMS中一个非常基础且核心的辅助函数,它通过结合 Session、Cookie 和数据库查询 三重验证机制,可靠地判断用户的登录状态,并返回用户信息,为整个系统的权限控制提供了坚实的基础,理解它的工作原理,对于二次开发和排查登录问题非常有帮助。
