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) |