RAGFLOW修改忘记了密码的用户的密码

前言

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()
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,记得载明出处,(期待)。 内容有问题?请点此跟我反馈
上一篇