84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
|
|
#!/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)
|