feat: 用户权限系统(权限位/管理员全权限/前端隐藏/最后管理员保护)
This commit is contained in:
+27
-2
@@ -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 '[]'"),
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user