From a299d786fe11dbe7f5c369e0eb41c913a295f333 Mon Sep 17 00:00:00 2001 From: thsrite Date: Thu, 18 Jan 2024 11:08:16 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AF=86=E7=A0=81=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E7=94=9F=E6=88=90=20&&=20=E4=BF=AE=E6=94=B9=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=BC=BA=E5=88=B6=E8=A6=81=E6=B1=82=E5=A4=A7=E5=86=99?= =?UTF-8?q?=E5=B0=8F=E5=86=99=E6=95=B0=E5=AD=97=E7=BB=84=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- app/api/endpoints/user.py | 5 +++++ app/core/config.py | 2 -- app/db/init.py | 16 +++++++++++++++- app/main.py | 4 +++- config/app.env | 4 +--- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 98a97c54..1bf199a6 100644 --- a/README.md +++ b/README.md @@ -98,8 +98,7 @@ MoviePilot需要配套下载器和媒体服务器配合使用。 下载 [app.env 模板](https://github.com/jxxghp/MoviePilot/raw/main/config/app.env),修改后放配置文件目录下,app.env 的所有配置项也可以通过环境变量进行配置。 -- **❗SUPERUSER:** 超级管理员用户名,默认`admin`,安装后使用该用户登录后台管理界面,**注意:启动一次后再次修改该值不会生效,除非删除数据库文件!** -- **❗SUPERUSER_PASSWORD:** 超级管理员初始密码,默认`password`,建议修改为复杂密码,**注意:启动一次后再次修改该值不会生效,除非删除数据库文件!** +- **❗SUPERUSER:** 超级管理员用户名,默认`admin`,安装后使用该用户登录后台管理界面。`初始化超级管理员密码仅会生成一次,请在日志中查看并自行登录系统修改`。**注意:启动一次后再次修改该值不会生效,除非删除数据库文件!** - **❗API_TOKEN:** API密钥,默认`moviepilot`,在媒体服务器Webhook、微信回调等地址配置中需要加上`?token=`该值,建议修改为复杂字符串 - **BIG_MEMORY_MODE:** 大内存模式,默认为`false`,开启后会增加缓存数量,占用更多的内存,但响应速度会更快 - **GITHUB_TOKEN:** Github token,提高自动更新、插件安装等请求Github Api的限流阈值,格式:ghp_**** diff --git a/app/api/endpoints/user.py b/app/api/endpoints/user.py index 0abff149..e119ab9d 100644 --- a/app/api/endpoints/user.py +++ b/app/api/endpoints/user.py @@ -1,4 +1,5 @@ import base64 +import re from typing import Any, List from fastapi import APIRouter, Depends, HTTPException, UploadFile, File @@ -59,6 +60,10 @@ def update_user( """ user_info = user_in.dict() if user_info.get("password"): + # 正则表达式匹配密码包含大写字母、小写字母、数字 + pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]+$' + if not re.match(pattern, user_info.get("password")): + return schemas.Response(success=False, message="密码需包含大写小写数字") user_info["hashed_password"] = get_password_hash(user_info["password"]) user_info.pop("password") user = User.get_by_name(db, name=user_info["name"]) diff --git a/app/core/config.py b/app/core/config.py index a9440143..a329149f 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -35,8 +35,6 @@ class Settings(BaseSettings): CONFIG_DIR: str = None # 超级管理员 SUPERUSER: str = "admin" - # 超级管理员初始密码 - SUPERUSER_PASSWORD: str = "password" # API密钥,需要更换 API_TOKEN: str = "moviepilot" # 登录页面电影海报,tmdb/bing diff --git a/app/db/init.py b/app/db/init.py index bd3444f4..4cd282ee 100644 --- a/app/db/init.py +++ b/app/db/init.py @@ -1,3 +1,6 @@ +import random +import string + from alembic.command import upgrade from alembic.config import Config @@ -14,13 +17,24 @@ def init_db(): """ # 全量建表 Base.metadata.create_all(bind=Engine) + + +def init_super_user(): + """ + 初始化超级管理员 + """ # 初始化超级管理员 with SessionFactory() as db: _user = User.get_by_name(db=db, name=settings.SUPERUSER) if not _user: + # 定义包含数字、大小写字母的字符集合 + characters = string.ascii_letters + string.digits + # 生成随机密码 + random_password = ''.join(random.choice(characters) for _ in range(16)) + logger.info(f"初始化超级管理员随机密码 {random_password} 请登录系统后在设定中修改。 注:该密码只会显示一次,请注意保存。") _user = User( name=settings.SUPERUSER, - hashed_password=get_password_hash(settings.SUPERUSER_PASSWORD), + hashed_password=get_password_hash(random_password), is_superuser=True, ) _user.create(db) diff --git a/app/main.py b/app/main.py index fe954d8a..03f79f20 100644 --- a/app/main.py +++ b/app/main.py @@ -19,7 +19,7 @@ if SystemUtils.is_frozen(): from app.core.config import settings from app.core.module import ModuleManager from app.core.plugin import PluginManager -from app.db.init import init_db, update_db +from app.db.init import init_db, update_db, init_super_user from app.helper.thread import ThreadHelper from app.helper.display import DisplayHelper from app.helper.resource import ResourceHelper @@ -202,6 +202,8 @@ def start_module(): start_frontend() # 检查认证状态 check_auth() + # 初始化超级管理员 + init_super_user() if __name__ == '__main__': diff --git a/config/app.env b/config/app.env index 701c3037..0b2804a1 100644 --- a/config/app.env +++ b/config/app.env @@ -11,10 +11,8 @@ HOST=0.0.0.0 DEBUG=false # 是否开发模式,打开后后台服务将不会启动 DEV=false -# 【*】超级管理员,设置后一但重启将固化到数据库中,修改将无效 +# 【*】超级管理员,设置后一但重启将固化到数据库中,修改将无效(初始化超级管理员密码仅会生成一次,请在日志中查看并自行登录系统修改) SUPERUSER=admin -# 【*】超级管理员初始密码,设置后一但重启将固化到数据库中,修改将无效 -SUPERUSER_PASSWORD=password # 大内存模式,开启后会增加缓存数量,但会占用更多内存 BIG_MEMORY_MODE=false # 自动检查和更新站点资源包(索引、认证等)