Kamixitong/reset_admin_password.py

84 lines
2.9 KiB
Python
Raw Normal View History

2025-11-22 20:32:49 +08:00
#!/usr/bin/env python3
"""
重置管理员密码脚本
用于解决密码哈希兼容性问题
"""
import sys
import os
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 尝试加载.env文件在导入app之前确保环境变量生效
try:
from dotenv import load_dotenv
env_loaded = load_dotenv()
if env_loaded:
print("成功加载.env文件")
else:
print("未找到或无法加载.env文件将使用默认配置")
except ImportError:
print("python-dotenv未安装跳过.env文件加载")
from app import create_app, db
from app.models.admin import Admin
from werkzeug.security import generate_password_hash
def reset_admin_password(username='admin', new_password='admin123'):
"""重置管理员密码"""
# 检测环境配置
config_name = os.environ.get('FLASK_CONFIG', 'production')
# 检查数据库配置
database_url = os.environ.get('DATABASE_URL', '')
if database_url:
print(f"使用数据库: {database_url.split('@')[-1] if '@' in database_url else database_url[:50]}...")
else:
print("警告: 未设置 DATABASE_URL 环境变量,将使用默认配置")
# 使用生产环境配置
app = create_app(config_name)
with app.app_context():
# 查找管理员用户(排除已删除的)
admin = Admin.query.filter_by(username=username, is_deleted=0).first()
if not admin:
print(f"错误: 用户 '{username}' 不存在或已被删除")
return False
try:
# 重新设置密码(使用新格式)
admin.set_password(new_password)
db.session.commit()
print(f"成功: 用户 '{username}' 的密码已重置为: {new_password}")
print(f"新的密码哈希格式: {admin.password_hash[:50]}...")
return True
except Exception as e:
db.session.rollback()
print(f"错误: 重置密码失败 - {str(e)}")
import traceback
traceback.print_exc()
return False
if __name__ == '__main__':
# 支持命令行参数或交互式输入
if len(sys.argv) > 1:
# 命令行参数方式
username = sys.argv[1]
new_password = sys.argv[2] if len(sys.argv) > 2 else 'admin123'
else:
# 交互式输入方式
username = input("请输入要重置的用户名 (默认: admin): ").strip() or 'admin'
new_password = input("请输入新密码 (默认: admin123): ").strip() or 'admin123'
print(f"正在重置用户 '{username}' 的密码...")
success = reset_admin_password(username, new_password)
if success:
print("密码重置完成!现在可以使用新密码登录了。")
else:
print("密码重置失败,请检查错误信息。")
sys.exit(0 if success else 1)