前言
RAGFLOW是一个开源的企业级RAG AI知识检索系统,能够很方便的进行文档读取分析。但是截止至目前(2025年1月18日),私有化部署的RAGFLOW仍然只有注册功能,根本没有忘记密码后找回密码的功能。假如用户忘记了密码,登录不进系统,那么,用户将在系统里丢失这个账号,根本找不回来。我就碰到了这个问题。这个文章就是介绍一种方法,通过修改RAGFLOW的数据库的方法来强行修改忘记了密码的用户的密码,从而让用户重新能够使用自己的账号。
连接数据库
首先要操作数据库,我们肯定要先连接到数据库,RAGFLOW默认安装运行的情况下(按照官方教程来的话),会拉取一个MYSQL的docker镜像,然后RAGFLOW便会以这个MYSQL容器来进行大部分的数据储存。我们要连接的就是这个容器,这个mysql是可以从外部连接的,你只需要使用mysql连接工具(Datagrip等,只要能远程操作Mysql数据库中数据表的工具都行,甚至直接用sql语句也行,具体语句本文不介绍),连接上这个容器。下面是连接数据库的一些参数:
RAGFLOW默认数据库账号:root
RAGFLOW默认数据库密码:infini_rag_flow
RAGFLOW默认数据库端口:5455
假如上面的账号密码不正确,或者是非默认的情况下,可以查看ragflow的运行目录下的/conf/service_conf.yaml文件(假如是源码运行的方式)或者查看运行目录下的/docker/service_conf.yaml.template文件(假如是docker运行的),这个是RAGFLOW的启动配置文件,找到其中的关于mysql的部分(下面是配置文件的一部分):
mysql:
name: '${MYSQL_DBNAME:-rag_flow}'
user: '${MYSQL_USER:-root}'
password: '${MYSQL_PASSWORD:-infini_rag_flow}'
host: '${MYSQL_HOST:-mysql}'
port: 3306
max_connections: 100
stale_timeout: 30
可以从上面的数据库文件
找到用户数据表
连接上数据库之后,我们就要找到用户信息表格,连接数据库后打开数据库“rag_flow”
从下面的数据库中找到user这个表
打开这个表,表的结构如下图:
接下来我们就是找到要修改的用户的那一个栏目,找到password,可以看到password如值大概是如下图所示:
这个栏目就是用户的密码。因为RAGFLOW会对用户的密码进行加密,所以这里显示的是乱码(正常的应用都应该是这样),我们现在就是替换用户这个密码栏目,从而强行修改密码。
下面是密码1234567890的加密值
scrypt:32768:8:1$zqX8KSRdPJfl8qPN$d0e7cb8b22d0b0628d3f8996840b67edac502cfb8081f2814500a773bc48a3624a2ae28fa832090219a2ead2832af9b8f75a5119be9118c3eb4a343ddc2edd31
将要修改的用户的password栏目改为这个值就可以了。这样子用户的密码就被强制替换为1234567890,让用户重新登录就行了。
如何强制修改为其他密码?
我按照RAGFLOW的加密算法写了一个加密密钥生成脚本,可以通过这个脚本来计算出加密后的密钥,将这个程序运算出来的hash拷贝到password栏目便可以强制更换用户的密码了。(注意,密码长度需要>=8位!否则修改后用户无法登录进去)
项目地址:
https://gitlab.q2019.com/q2019715/ragflow-keycompute
源代码:
import base64
from werkzeug.security import generate_password_hash
def process_password(password):
"""
处理密码的主要函数
1. Base64编码
2. 生成密码哈希
"""
# Base64编码
encode_password = base64.b64encode(password.encode('utf-8')).decode('utf-8')
# 生成密码哈希
password_hash = generate_password_hash(encode_password)
return encode_password, password_hash
def main():
while True:
# 用户交互菜单
print("\n密码处理程序")
print("1. 处理密码")
print("2. 退出")
choice = input("请选择操作(1/2): ")
if choice == '1':
# 获取用户输入的密码
password = input("请输入要处理的密码: ")
# 处理密码
try:
base64_password, hashed_password = process_password(password)
# 输出结果
print("\n处理结果:")
print("原始密码:", password)
print("Base64编码:", base64_password)
print("密码哈希:", hashed_password)
except Exception as e:
print(f"处理出错: {e}")
elif choice == '2':
print("感谢使用,再见!")
break
else:
print("无效的选择,请重新输入。")
if __name__ == "__main__":
main()