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