xyOps 用户与角色权限体系实战指南:账户管理、有效权限计算与资源隔离
【免费下载链接】xyopsThe next generation of Cronicle: open-source job scheduling, visual workflows, server monitoring, alerting, and incident response.项目地址https://gitcode.com/gh_mirrors/xy/xyops点击查看免费下载本文围绕 xyOps 的 Users and Roles 文档 展开系统讲解用户账户模型、角色Role、有效权限Effective Permissions的计算规则、类别/服务器组资源限制、会话与认证安全以及管理员日常运维操作。读完本文你将掌握如何在 xyOps 中创建与隔离用户、设计最小权限角色、理解admin特权如何穿透所有限制并能够结合源码定位权限校验链路安全地落地部门隔离与环境分离等真实场景。一、账户与权限体系总览xyOps 的用户系统由三部分组成核心账户体系内置认证、会话管理、密码流程、权限扩展角色与有效权限、类别/组资源限制、用户安全日志、Logout All Sessions、头像与丰富的 UI 偏好、以及管理员工具Admin UI 中的用户与角色管理所有变更均由后端强制生效。三层结构可以概括为身份每个用户代表一个真实的人类账户见 User 对象定义授权权限通过直接赋值或角色Role授予见 Privilege List认证支持本地密码登录与受信请求头 SSO见 SSO Integration。从源码结构看用户与角色相关 API 分散在 lib/api/user.js、lib/api/roles.js 与 lib/api/admin.js 中权限计算的核心逻辑集中在 lib/api.js 的getComputed*系列方法中本文后续会逐一对应说明。二、用户档案User Profile字段详解每个用户的完整 JSON 结构见 User 对象。一个典型的用户记录包含以下关键字段组身份与状态字段说明username全局唯一用户名用于登录与标识full_name显示名称email联系方式用于通知与找回密码active布尔值true/false表示启用/停用停用用户无法登录认证与凭据passwordbcrypt 哈希值明文密码从不落盘salt每个用户独立的盐值force_password_reset内部标志置位后强制要求重置密码SSO 登录时也会被拦截见 lib/sso.js。在 data.md 示例 中可以看到实际存储形态password: $2a$10$gB1MOjFZErSRJFI0nYtw/...是典型的 bcrypt 哈希$2a$前缀配合独立的salt字段。后端在配置层通过User.use_bcrypt默认true官方建议保持开启控制哈希算法见 docs/config.md。授权字段privileges以对象键形式声明的直接权限roles角色 ID 数组见下文角色一节categories/groups可选的资源限制数组用于限定事件类别与服务器组访问范围。UI 偏好字段language、region、num_format、hour_cycle、timezone、color_acc、privacy_mode、effects、contrast、motion、volume、searches保存的搜索等。这些字段属于非关键设置用户可通过user_settingsAPI 自行修改但后端会严格剔除敏感与管理员管控字段见下文安全边界。头像用户可上传/替换个人头像后端以 64px 与 256px 两种尺寸存储见 lib/api/avatar.js 与 lib/api/admin.js 中的删除逻辑。三、角色Roles与权限管理3.1 角色的作用角色是一组权限的捆绑单元可附带可选资源限制。把角色分配给用户后用户即获得角色的全部权限贡献。完整 JSON 结构见 Role 对象核心属性如下属性说明privileges向被分配用户贡献的权限集合categories可访问的事件类别列表groups可访问的服务器组列表enabled仅启用状态的角色才会贡献权限注意 data.md 中的一条关键约定privileges中每个已授予的权限必须以true作为值不要写入false、0、null或空字符串等假值否则可能引发错误的权限判定。一个典型的角色 JSON{ id: all, title: All Users, enabled: true, username: admin, notes: A base set of privileges for all users to enjoy., categories: [], groups: [], privileges: { create_events: true, edit_events: true, run_jobs: true, tag_jobs: true } }3.2 角色的生命周期与实时生效管理员可在 Admin UI 中创建、编辑、启用/禁用、删除角色。从源码看角色 CRUD 对应 lib/api/roles.js 中的api_create_role/api_update_role/api_delete_role/api_get_roles其中api_create_role在未指定id时会自动生成以r开头的短 IDTools.generateShortID(r)并校验 ID 唯一性lib/api/roles.js所有写操作都要求requireAdmin会话每次变更后都会调用self.updateRoles()该方法重新计算所有在线用户的有效权限并实时推送更新lib/api/roles.js。角色变更的实时性很有价值当角色被修改或禁用后用户活跃会话中的socket.admin标志与socket.computed计算权限立即被刷新同时后端会向每个受影响用户的 socket 推送受限的activeJobs、activeAlerts、servers、groups、categories、events列表——这意味着权限变更无需用户重新登录即可生效。3.3 权限列表速查xyOps 的完整权限清单见 Privileges按功能模块组织常见权限包括模块权限 ID特殊admin隐含全部权限绕过常规限制告警create_alerts、edit_alerts、delete_alerts存储桶create_buckets、edit_buckets、delete_buckets类别create_categories、edit_categories、delete_categories通道create_channels、edit_channels、delete_channels事件create_events、edit_events、delete_events组create_groups、edit_groups、delete_groups作业run_jobs、abort_jobs、update_jobs、delete_jobs、tag_jobs监控create_monitors、edit_monitors、delete_monitors插件create_plugins、edit_plugins、delete_plugins标签create_tags、edit_tags、delete_tags工单create_tickets、edit_tickets、delete_ticketsWeb Hookscreate_web_hooks、edit_web_hooks、delete_web_hooks服务器add_servers、update_servers、create_snapshots、delete_snapshots杂项send_emails、bulk_export、update_state移除用户全部权限后该用户实际上就是一个只读用户。四、有效权限Effective Permissions的计算与执行4.1 计算规则xyOps 将用户的有效授权视为直接授权与角色授权的合并遵循三条规则权限并集账户直接权限与所有已启用角色的权限取并集资源范围若用户/角色未定义任何categories或groups则默认拥有全部类别或组的访问权定义了则被限定管理员覆盖若admin为真直接授予或经角色继承用户可执行任何操作且不受类别/组限制。从源码看这三条规则分别对应 lib/api.js 中的getComputedPrivileges/getComputedCategories/getComputedGroupsgetComputedPrivileges(user)L229-L240以用户自身privileges为基底遍历user.roles仅当角色存在且enabled时mergeHashInto合并角色权限getComputedCategories(user)L242-L259先查计算后权限若含admin直接返回[]管理员永不受限即使admin来自角色或用户记录上残留过期的类别 ID否则合并用户与角色的categories并去重getComputedGroups(user)L261-L278同样的管理员优先 合并去重逻辑。getComputedUser(user)L280-L287将这三维合并为一次计算供整个后端复用。测试 test/suites/test-users.js 专门验证了直接管理员与经角色继承的管理员在getComputedCategories/getComputedGroups上都返回空数组即admin特权始终胜出。4.2 执行与强制API 校验后端在每一次 API 调用上强制校验权限并对类别/组/目标做资源级检查。例如requireValidUser会先验证会话/API Key 的合法性与有效期lib/api.jsrequireAdmin在requireValidUser之上再校验管理员身份UI 过滤前端列表与控件尊重有效权限与资源限制不可访问项被隐藏或禁用。前端通过 htdocs/js/pages/admin/Users.class.js 等页面类调用管理员 API后端返回的数据已经过getUserLimited*系列方法过滤见 lib/api.js。getUserLimited*系列是 UI 数据过滤的关键实现getUserLimitedEvents、getUserLimitedJobs、getUserLimitedCategories、getUserLimitedGroups、getUserLimitedServers、getUserLimitedAlerts分别对事件、作业、类别、组、服务器、告警做范围过滤且都遵守管理员直接返回全量、无限制用户返回全量、有限制用户按交集过滤的统一模式。组限制使用任一匹配any-match语义事件/作业的目标数组只要与允许组有任一交集即可见服务器可见性同理任一组成员身份即满足。五、资源限制Resource Restrictions深入5.1 类别与组限制语义类别限制若用户/角色定义了任意categories该用户只能查看与操作这些类别中的事件未定义则允许全部类别除非被权限进一步禁止。组限制若定义了任意groups在创建、更新、手动运行事件、更改实时作业目标、释放延迟作业、恢复被挂起作业时每个显式列出的目标都必须被允许而事件/作业的读取仅要求至少一个匹配目标即可访问某台服务器也只需匹配一个组成员身份。执行目标检查直接比较 ID不会将单个服务器 ID 解析为其组成员后再做检查。5.2 运行时定向Runtime Targeting限制组受限账户不能使用_xy_override_targets参数或强制指定server字段即使目标是允许范围内的也不行。这一限制覆盖保存的事件、工作流节点、用户字段、触发器参数、插件参数默认值。而未受组限制的账户与管理员可继续使用这些功能。_xy_override_server参数对所有账户都是保留参数禁止使用。从源码看这一条由requireRuntimeTargetPrivileges强制实施lib/api.jsvar deny () this.doError(access, Group-limited accounts cannot use runtime target overrides or forced servers., callback); if (data.server) { if (!allow_server) return deny(); var server (this.servers || {})[data.server]; if (!server || !Tools.includesAny(cuser.groups, server.groups || [])) return deny(); } var has_override params Tools.isaHash(params) (_xy_override_targets in params); if (has_override(data.params)) return deny();实现还额外检查了参数ID 与值两个维度因为空字段与默认值可能通过宏、触发器或工作流输入在运行时获得目标所以只要字段定义里存在_xy_override_targets即拒绝。同时计划触发器与 magic 触发器的params也会被检查它们会把参数合并进启动的作业。5.3 典型场景场景做法部门隔离为用户分配仅允许 Dev 或 Ops 类别的角色环境分离将特定用户限制在 Staging 组而非 Production 组5.4 旧版组限制与工作流Legacy Group Limits and Workflows服务器组限制是继承自 Cronicle 的旧版兼容特性。工作流较新且可能包含嵌套子工作流因此采用刻意简化的读取策略读取组受限用户可查看工作流定义与父工作流作业类别受限用户仅当工作流顶层类别在范围内时可见。嵌套节点使用的类别/组不影响读取可见性。写入与手动运行创建、更新或手动运行工作流时会递归检查每一个可达的事件节点与作业节点包括嵌套子工作流中的节点。用户必须拥有所引用类别的访问权、每个保存事件目标的访问权以及每个节点级目标覆盖的访问权。循环引用递归校验会安全地检测已访问的子工作流因此循环引用不会造成死循环。这样既保证了在拥有数千事件的安装上工作流列表与实时页面保持可用又阻止受限用户在其被分配范围之外创建、修改或手动启动工作。六、会话与认证Sessions and AuthenticationxyOps 覆盖账户创建、登录、会话管理与密码重置并在此基础上增加活动日志等能力。6.1 会话过期会话按 User.session_expire_days 配置过期默认 365 天。相关的用户管理配置项还包括配置项默认值说明User.max_failed_logins_per_hour5每小时最大登录失败次数触发锁定User.max_forgot_passwords_per_hour3每小时最大找回密码请求次数User.free_accountsfalse是否允许用户无需管理员邀请自行注册User.use_bcrypttrue是否使用 bcrypt 哈希密码User.use_csrftrue是否启用 CSRF TokenUser.valid_username_match^[\w\-\.]$用户名允许字符User.block_username_match—保留/屏蔽用户名正则安全与命名空间保护User.cookie_settings—会话 Cookie 的 path、secure、httpOnly、sameSite 属性6.2 锁定Lockout与解锁每小时多次登录失败会触发锁定需通过密码重置解锁管理员可对用户执行 Reset Lockouts。锁定阈值由User.max_failed_logins_per_hour默认 5 次/小时控制。前端管理表单中提供了 Reset Lockouts 复选框提示语为Check this box to reset any lockouts on the account (too many incorrect password attempts)见 htdocs/js/pages/admin/Users.class.js。6.3 密码管理用户可自行修改密码但必须提供当前密码后端通过usermgr.comparePasswords校验见 lib/api/user.js 与 lib/api/admin.js忘记/重置密码流程由邮件模板支持模板见 sample_conf/emails/ 下的recover_password.txt、changed_password.txt等管理员重置密码时前端会将password字段转为new_password提示给后端见 Users.class.js。6.4 单点登录SSOxyOps 支持通过反向代理如 OAuth2-Proxy的受信请求头 SSO可以基于 IdP 组自动分配角色/权限并可在登出时跳转。相关配置项docs/config.md配置项说明SSO.enabled启用 SSO 并禁用本地用户名/密码登录默认falseSSO.whitelist允许发送受信请求头的 IP/CIDR 列表SSO.header_map将受信请求头映射到用户字段username、full_name、email、groupsSSO.group_role_map/SSO.group_privilege_map基于 IdP 组自动分配角色/权限详见 SSO Integration。SSO 账户会带有remote远程账户与sync同步标志等内部标志。此外force_password_reset与activefalse的账户在 SSO 登录时同样会被拒绝lib/sso.js。七、安全日志Security Log与 Logout All Sessions7.1 双层日志体系用户安全日志记录登录、资料更新、密码修改、通知/警告等动作并附带 IP 与 User-Agent 元数据在 UI 的 Security Log 中查看。系统活动日志面向管理员的更广泛审计日志覆盖所有系统动作。从源码看用户安全日志存储在security/username存储列表中登录动作还会额外记录session_id供登出所有会话使用见 lib/api/user.js。日志写入由logUserActivity完成lib/engine.js登录与改密码分别记录user_login与user_password动作lib/engine.js。安全日志 API 支持分页读取并利用useragent-ng解析出友好 UA 字符串如Chrome 15.0.874 / macOS见 lib/api/user.js。7.2 登出所有会话Logout All Sessions用户自助输入当前密码后可使所有其他会话失效当前会话保持活跃。源码中的api_logout_all先校验密码comparePasswords确认后通过logoutAllUserSessions在后台任务中遍历security/username下所有user_login记录向对应 socket 发送logout命令并撤销认证删除sessions/session_id记录lib/api/user.js。管理员强制管理员可对任意用户执行 Logout All Sessions同样以后台内部作业startInternalJobtitle 为 Logging out user sessions for: ...执行若确实终止了会话会发送汇总邮件lib/api/admin.js。汇总邮件使用sendFancyMail(logout_all_sessions, ...)发送模板见 sample_conf/emails/logout_all_sessions.txt内容包括 Session ID、IP、UA、创建时间与最后使用时间。八、管理员任务Admin Tasks管理员可通过 Admin UI 或等价 API 执行以下操作任务说明创建用户设置用户名、显示名、邮箱、初始密码、权限/角色可选发送欢迎邮件编辑用户更新资料、修改密码、调整权限/角色、分配类别/组限制、切换启用/停用解锁账户因多次失败登录导致锁定时重置锁定并清除节流删除用户删除账户及其安全日志关闭活跃 socket强制登出入队后台任务终止用户的所有其他会话管理角色创建/更新带权限与类别/组限制的角色启用/禁用角色从源码看用户删除流程lib/api/admin.js会依次删除用户记录、users/username/avatar/64.png与avatar/256.png两种尺寸头像最后删除security/username安全日志——这印证了文档中删除用户会连安全日志一起删除的描述。8.1 用户设置的安全边界用户只能通过user_settingsAPI 修改非关键字段后端会删除以下参数lib/api/user.jspassword、new_password、old_password、salt认证相关active、created账户状态privileges、roles授权相关categories、groups资源限制注释明确说明与权限/角色一样属于管理员管控绝不允许通过用户设置修改force_password_reset、fl_date_code、fl_count内部标志。测试 test/suites/test-users.js 专门验证了这一边界一个被限制在categories: [general]、groups: [main]的用户尝试通过user_settings把categories/groups清空结果是普通偏好contrast保存成功而两组限制保持原样[general]、[main]且存储层记录同样被保留。8.2 有效权限的实时刷新源码级验证角色变更后updateRoles()lib/api/roles.js的执行路径值得关注收集所有已认证在线用户的用户名仅加载这些用户loadMultipleUsers以保证效率对每个用户调用getComputedUser重新计算权限更新每个 socket 的admin标志与computed权限对象通过socket.send(update, {...})推送受限的activeJobs、activeAlerts、serverCache、servers、groups、categories、events数据。配合 test/suites/test-users.js 中的管理员作用域测试创建带admin: true但附带了类别/组限制的角色验证直接管理员与角色继承管理员的计算结果均为空限制可以看到权限计算的整个闭环角色变更 → 重算有效权限 → 实时推送 UI 数据 → API 层强制校验。九、最佳实践与排查建议用角色而非逐用户授权角色变更可实时推送到所有在线会话批量调整权限更高效、更可审计。admin是终极通行证无论直接授予还是角色继承admin都会清空类别/组限制并隐含全部权限。不要把admin授予给资源受限角色之外的用户除非确有需要。组受限账户的运行时定向限制如果你的用户需要_xy_override_targets或强制服务器功能不要给他们加组限制反之加了组限制的账户即使目标是允许的这些功能也会被requireRuntimeTargetPrivileges拒绝。工作流读取与写入的差异工作流读取只看顶层类别但写入/手动运行会递归校验所有嵌套节点——这是为了在数千事件规模下保持列表可用性同时守住写入边界。安全日志与登出审计将登出所有会话作为账号被入侵后的第一响应手段管理员强制登出会留下汇总邮件与系统活动日志便于取证。合理配置锁定阈值根据团队习惯调整User.max_failed_logins_per_hour默认 5既要防暴力破解也要避免误伤正常用户。如需深入可继续阅读User 与 Role 完整 JSON 定义权限清单全文会话过期与用户管理配置SSO 集成指南核心权限计算实现角色 CRUD 与实时刷新用户设置安全边界测试赞分享【免费下载链接】xyopsThe next generation of Cronicle: open-source job scheduling, visual workflows, server monitoring, alerting, and incident response.项目地址https://gitcode.com/gh_mirrors/xy/xyops点击查看免费下载相关推荐OpCore Simplify丢一份硬件报告进去得到一套能用的 Hackintosh EFIOpCore Simplify丢一份硬件报告进去得到一套能用的 Hackintosh EFI 它接收一份硬件报告自动生成一套可以直接写进 U 盘的 Ope开发工具CLIxyOps 权限体系Privileges完全指南用户、角色与资源级访问控制xyOps 权限体系Privileges完全指南用户、角色与资源级访问控制 xyOps 采用一套简单而灵活的权限系统控制功能访问权限PrivilegeFlagsmith 角色权限管理RBAC完全指南角色、用户组与四级权限体系Flagsmith 角色权限管理RBAC完全指南角色、用户组与四级权限体系 本指南基于 Flagsmith 开源仓库中的官方 RBAC 文档系统讲解 F后端前端上一篇Google AI Edge Gallery实战指南在手机上体验本地AI模型的效率秘籍下一篇打造完美侧边菜单React Native 自定义侧边菜单组件推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考