织梦DedeCMS 5.7本身并没有提供一个官方的、名为“免登录接口”的功能,我们可以通过分析其用户登录机制,手动创建一个自定义的API接口,来实现外部系统(如App、其他网站、小程序等)让用户免登录进入织梦后台或会员中心。

这个接口的核心原理是:模拟织梦的后台登录验证流程,如果验证成功,我们就在服务端生成一个有效的织梦后台Cookie,然后通过重定向或返回Cookie信息,让用户的浏览器在访问织梦后台时,服务器误以为用户已经登录。
第一步:理解织梦DedeCMS 5.7的登录验证机制
在动手之前,我们必须搞清楚织梦是如何判断用户是否登录的。
- 登录页面:
/dede/login.php - 处理登录的脚本:
/dede/login_action.php - 核心验证逻辑:
login_action.php接收用户名和密码。- 它会调用
include/login.class.php中的checkUser()方法。 checkUser()方法会查询dede_admin表,验证用户名和密码是否正确。注意:密码是经过md5()加密存储的。- 如果验证成功,它会更新
dede_admin表中该用户的logintime(登录时间) 和loginip(登录IP)。 - 最关键的一步是:它会设置一个
Cookie,名称通常是dede_logintime,值为当前的时间戳,这个Cookie是判断用户是否处于登录状态的主要依据之一。
- 全局登录判断:在织梦后台的每个页面(如
index.php),开头都会包含include/common.inc.php,这个文件会检查是否存在有效的dede_logintimeCookie,如果没有,或者Cookie中的时间与服务器记录不符,就会判定用户未登录并跳转到登录页。
我们的目标就是创建一个脚本,它能正确验证用户名和密码,并在成功后,手动在用户浏览器上设置这个关键的 dede_logintime Cookie。
第二步:创建免登录接口
我们将创建一个独立的PHP文件作为我们的API接口。

创建接口文件
在织梦根目录下(与 dede 文件夹同级)创建一个新文件,api/login.php。
编写接口代码
打开 api/login.php,粘贴以下代码,代码中包含了详细的注释,解释了每一步的作用。
<?php
/**
* 织梦DedeCMS 5.7 免登录接口
* 使用方法: /api/login.php?username=你的用户名&password=你的密码
*/
// 1. 设置必要的请求头,防止中文乱码
header('Content-Type: text/html; charset=utf-8');
// 2. 引入织梦数据库配置文件,获取数据库连接信息
// 这一步非常重要,可以确保我们的接口使用与织梦相同的数据库配置
require_once (dirname(__FILE__) . "/dede/config.php");
// 3. 获取前端传递的参数
$username = isset($_GET['username']) ? trim($_GET['username']) : '';
$password = isset($_GET['password']) ? trim($_GET['password']) : '';
// 4. 参数校验
if (empty($username) || empty($password)) {
// 返回JSON格式的错误信息
$response = [
'code' => 400,
'msg' => '用户名和密码不能为空',
'data' => null
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
// 5. 连接数据库并查询用户
$link = mysql_connect($cfg_dbhost, $cfg_dbuser, $cfg_dbpass);
if (!$link) {
$response = [
'code' => 500,
'msg' => '数据库连接失败',
'data' => null
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
mysql_select_db($cfg_dbname);
mysql_query("SET NAMES 'utf8'");
// SQL查询语句,注意密码字段是pwd
$sql = "SELECT * FROM `#@__admin` WHERE `userid` = '{$username}' AND `pwd` = md5('{$password}')";
$result = mysql_query($sql);
$user = mysql_fetch_assoc($result);
// 6. 判断用户是否存在及密码是否正确
if (!$user) {
$response = [
'code' => 401,
'msg' => '用户名或密码错误',
'data' => null
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
// 7. 登录成功,更新登录信息并设置Cookie
// 更新登录时间和IP
$login_time = time();
$login_ip = GetIP(); // 织梦自获取IP函数
mysql_query("UPDATE `#@__admin` SET `logintime` = '{$login_time}', `loginip` = '{$login_ip}' WHERE `userid` = '{$username}'");
// 设置关键的登录Cookie
// setcookie(name, value, expire, path, domain, secure, httponly);
// path必须设置为'/dede',因为织梦后台的Cookie作用域是这个目录
setcookie("dede_logintime", $login_time, time() + 3600 * 24, '/dede/');
// 8. 返回成功信息,并提供后台入口URL
$admin_url = $cfg_cmspath . '/dede/index.php';
$response = [
'code' => 200,
'msg' => '登录成功',
'data' => [
'admin_url' => $admin_url,
'cookie_name' => 'dede_logintime',
'cookie_value' => $login_time
]
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
mysql_close($link);
// 辅助函数:获取IP地址 (从织梦include/helpers下找的)
function GetIP()
{
if (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_X_FORWARDED')) {
$ip = getenv('HTTP_X_FORWARDED');
} elseif (getenv('HTTP_FORWARDED_FOR')) {
$ip = getenv('HTTP_FORWARDED_FOR');
} elseif (getenv('HTTP_FORWARDED')) {
$ip = getenv('HTTP_FORWARDED');
} elseif (getenv('REMOTE_ADDR')) {
$ip = getenv('REMOTE_ADDR');
} else {
$ip = '127.0.0.1';
}
return $ip;
}
第三步:如何使用这个接口
你可以通过以下方式来使用这个接口了。
直接在浏览器中访问
打开浏览器,访问你的织梦网站地址,并带上参数:
http://你的域名.com/api/login.php?username=你的后台用户名&password=你的后台密码

-
如果成功,你会看到类似下面的JSON响应:
{ "code": 200, "msg": "登录成功", "data": { "admin_url": "/dede/index.php", "cookie_name": "dede_logintime", "cookie_value": "1678886400" } }你再去访问
http://你的域名.com/dede/index.php,你会发现你已经直接进入了织梦后台,无需再次登录! -
如果失败(例如用户名或密码错误),你会看到:
{ "code": 401, "msg": "用户名或密码错误", "data": null }
在App、小程序或前端页面中使用
在实际开发中,这个接口通常被App、小程序或前端网站调用,流程如下:
- 用户输入:在App或前端页面上,用户输入他们的织梦后台用户名和密码。
- 发起请求:前端代码(如JavaScript、Java、Python等)使用
POST或GET方式向api/login.php发送请求。 - 处理响应:
- 如果接口返回
code: 200,表示登录成功。关键在于,你的App或前端需要引导用户去访问织梦后台的URL(即响应中的admin_url)。 - 当用户的浏览器打开这个
admin_url时,我们之前设置的Cookie已经生效,织梦服务器会认为用户已登录,从而直接展示后台界面。 - 如果接口返回非
200的状态码,则向用户显示错误信息。
- 如果接口返回
重要提示:出于安全考虑,千万不要将用户密码明文存储在你的App或前端数据库中,这个接口只适用于“一次性”的登录跳转,即用户输入密码后,立即跳转到织梦后台,后续访问,依赖的是我们设置的 Cookie。
第四步:安全注意事项
直接使用这个接口存在安全风险,必须进行加固:
- HTTPS协议:强烈建议将你的网站配置为使用
HTTPS,这样可以防止在传输用户名和密码时被中间人窃听。 - 增加Token验证:为了防止接口被恶意调用(比如被黑客用脚本暴力破解后台密码),你应该增加一个Token验证机制。
- 实现方法:
a. 在织梦后台生成一个唯一的、难以猜测的Token(可以存入数据库或配置文件)。
b. 在调用
api/login.php时,必须带上这个Token,/api/login.php?username=xxx&password=xxx&token=你的安全Token。 c. 在login.php的开头先验证这个Token是否正确,不正确则直接拒绝请求。
- 实现方法:
a. 在织梦后台生成一个唯一的、难以猜测的Token(可以存入数据库或配置文件)。
b. 在调用
- 限制调用频率:可以加入简单的代码,限制单个IP在一段时间内(如1分钟)只能调用几次接口,防止暴力破解。
- 日志记录:记录每一次接口调用的信息(时间、IP、用户名、是否成功),以便于追踪异常行为。
- 接口文件保护:将
api目录设置为禁止外部访问,或者将login.php文件名改为一个随机、难以猜测的名字,减少被扫描到的风险。
通过以上步骤,你就可以为织梦DedeCMS 5.7搭建一个安全、可用的免登录接口了。
