一、操作背景

Halo 后台登录提示无效凭证,常规页面找回需要邮箱收验证码,因未配置 SMTP 邮件服务无法接收验证码,采用直接操作 MySQL 数据库重置管理员密码。

环境信息

  • 数据库容器名:mysql

  • MySQL 登录账号:root,密码:Shitou521!

  • Halo 数据库名:halo_85n664

  • 待重置账号:yiran

二、步骤 1:进入 MySQL 数据库终端

在服务器终端执行命令,进入 MySQL 命令行:

docker exec -it mysql mysql -uroot -pShitou521!

三、步骤 2:切换至 Halo 业务数据库

USE halo_85n664;

四、步骤 3:查询当前所有系统管理员账号(确认目标账号存在)

SELECT name FROM extensions WHERE name LIKE '/registry/users/%';

查询结果

/registry/users/anonymousUser
/registry/users/ghost
/registry/users/yiran

目标账号存储路径:/registry/users/yiran

五、步骤 4:两次密码重置 SQL 执行记录

第一次重置:密码设置为 123456

UPDATE extensions 
SET data = JSON_SET(convert(data using utf8mb4),'$.spec.password','{bcrypt}$2a$10$XWHHcjqR8Cx5DnisoRA7fehC1Pi0Kc9QRQOTlhoDdRwXYZzn0Xhfa') 
WHERE name = '/registry/users/yiran';

执行返回:Changed:1,代表密码修改成功。

第二次重置:密码改回默认 password(全小写)

UPDATE extensions 
SET data = JSON_SET(convert(data using utf8mb4),'$.spec.password','{bcrypt}$2a$10$7tBEL1sNQSr/uWtLZHLmCeA9IGx0I9/Jz//3Uwo/anIm9xdxv.xrO') 
WHERE name = '/registry/users/yiran';

七、关键必做操作:重启 Halo 容器刷新内存缓存(解决无效凭证报错)

直接修改数据库不会清空 Halo 程序内存里缓存的旧账号密码,必须重启容器加载最新配置:

bash

运行

docker restart halo-pro

等待 30 秒容器启动完成。

八、登录操作要求

打开浏览器无痕 / 隐私窗口(清除旧登录 Cookie 会话缓存)

访问后台地址,输入:

用户名:yiran

密码:password

登录后触发邮箱验证弹窗,因站点未配置 SMTP 邮件服务无法接收验证码,后续备选方案为新建超级管理员账号绕过邮箱校验。

未实施,就成功了,

sql
USE halo_85n664;
INSERT INTO extensions (`name`, `data`, `creation_timestamp`, `update_timestamp`) VALUES
('/registry/users/admin',
'{\"spec\":{\"displayName\":\"超级管理员\",\"email\":\"temp@qq.com\",\"password\":\"{bcrypt}$2a$10$7tBEL1sNQSr/uWtLZHLmCeA9IGx0I9/Jz//3Uwo/anIm9xdxv.xrO\",\"roles\":[\"super-role\"]},\"apiVersion\":\"registry.halo.run/v1alpha1\",\"kind\":\"User\",\"metadata\":{\"name\":\"admin\"}}',
UNIX_TIMESTAMP()*1000,
UNIX_TIMESTAMP()*1000);
执行完成后依旧执行 docker restart halo-pro,使用新账号admin、密码password直接登录后台,无需邮箱验证。