feat: 用户权限系统(权限位/管理员全权限/前端隐藏/最后管理员保护)

This commit is contained in:
2026-08-11 08:27:33 +08:00
parent a0d1a533c6
commit 06a9df111a
4 changed files with 192 additions and 35 deletions
+27 -2
View File
@@ -45,11 +45,35 @@ def _sqlite_pragma(dbapi_connection, connection_record):
class User(UserMixin, db.Model):
"""后台用户。"""
"""后台用户。
权限模型:
- is_admin=True:管理员,拥有全部权限,不受 perms 限制
- is_admin=False:按 perms 授权(JSON 数组,如 ["tasks","devices"])
- 权限位:tasks=任务管理, devices=设备控制, apks=应用管理, logs=日志查看
- 用户管理本身只有管理员能做(web_server 层强制),不设普通权限位
"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(255), nullable=False)
is_admin = db.Column(db.Boolean, default=True)
perms = db.Column(db.Text, default="[]") # JSON 数组:业务权限位
def get_perms(self):
try:
return json.loads(self.perms or "[]")
except Exception:
return []
def set_perms(self, lst):
"""设置权限位。管理员强制为全部权限(内部不区分)。"""
self.perms = json.dumps(list(lst or []), ensure_ascii=False)
def has_perm(self, perm):
"""是否拥有指定权限。管理员恒为 True。"""
if self.is_admin:
return True
return perm in self.get_perms()
def set_password(self, password):
self.password_hash = generate_password_hash(password)
@@ -195,7 +219,8 @@ class ApkFile(db.Model):
# 版本化 schema 迁移:新增结构变更时在此追加 (版本号, 说明, SQL)
# 版本号单调递增,只执行比当前 schema_version 新的迁移。
SCHEMA_MIGRATIONS = [
# (1, "初始 schema(由 create_all 建立,版本标记从 1 开始)", None),
(1, "用户权限位:user 表新增 perms 列(JSON 数组,默认空=无业务权限,管理员不受限)",
"ALTER TABLE user ADD COLUMN perms TEXT DEFAULT '[]'"),
]