05 · 安全账号与权限 —— Hmi.Security

职责:认证 + 授权 —— 账号 / 角色 / 权限(带等级约束),SQLite 落地,PBKDF2 散列。自成一体,无任何 Hmi.* 依赖,可单独取用。用 Microsoft.Data.Sqlite 8.0.10。

定位提醒:这套权限是给编译出的运行程序里的操作工用的,不是编辑器自身的权限。编辑器进程以 configMode = true 打开,Can 恒放行、CurrentLevel = 最高。


入口 AuthService

src/Hmi.Security/AuthService.cs(public sealed class)。构造 (IUserStore store, bool configMode = false):

  • configMode = true 仅用于编辑器进程:Can 恒真、CurrentLevel 取最大。
  • 运行程序(独立进程,--runtime)传 false,于是登录、ManageUsers、等级约束全部生效。
方法 作用
AuthResult Login(string user, string pwd) / Logout() 登录 / 登出
bool Can(Permission) / AuthResult Demand(Permission) 权限判断 / 要求
Bootstrap(...) 库空时建第一个管理员
CreateUser / ChangePassword / SetDisabled / SetUserRole / DeleteUser 账号管理
SaveRole / DeleteRole 角色管理
AllUsers() / AllRoles() / LoginCandidates() 列举

属性:Current、CurrentRole、CurrentUserName、CurrentLevel、StoreHasAnyUser。

等级规则:你只能动等级(Level)低于你自己的账号和角色 —— 挡住提权,也挡住把自己锁死。


存储契约 IUserStore

src/Hmi.Security/IUserStore.cs —— 只管存储,不含凭据逻辑:角色 CRUD(GetRoles / GetRole / UpsertRole / DeleteRole)+ 账号 CRUD(GetUsers / GetUser / UpsertUser / DeleteUser)。实现 SqliteUserStore。

配套类型

  • Permission([Flags])、Role(Name 为主键,含 Level、Permissions)、UserAccount(携带 PasswordHash / PasswordSalt —— 序列化给前端前必须白名单字段,别把散列送出去)。
  • LoginCandidate —— 安全投影(不含散列/等级),给登录下拉用。
  • PasswordHasher(Create / Verify,PBKDF2)、AuthResult。

小结

  • 编辑器里:new AuthService(store, configMode: true) —— 不拦操作,只借它读/写账号数据。
  • 运行程序里:new AuthService(store, configMode: false) —— 登录闸 + 权限判断 + 提权防护全生效。
  • 数据库位置由宿主决定(Shell 放在 <projectDir>\users.db)。