- 人工智能
- 计算机视觉
- 后端
- AI 应用
【免费下载链接】CompreFace
Leading free and open-source face recognition system
CompreFace 采用「全局角色 + 应用角色」的双层权限模型来管理多租户场景下的用户访问控制:全局角色决定你在系统本身的运维能力,应用角色决定你在具体某个集成应用内的操作权限。阅读本文你将掌握两套角色(owner / administrator / user)各自的权限边界、默认分配规则与"自删保护"等关键限制,并能对照 Java 后端源码(枚举定义、授权管理器、服务层逻辑)验证这些权限规则在代码中的真实落地方式。
角色体系总览
CompreFace 的角色系统由两种角色类型组成:
- 全局角色(Global Roles):定义用户在系统本身中的权限,这类用户的主要职责是维护系统本身;
- 应用角色(Application Roles):定义用户在某个应用内的权限,这类用户的主要职责是开发将集成 CompreFace 的应用。
官方建议:拥有高权限(owner、administrator)的用户应与业务敏感数据隔离,即运维人员不必加入具体应用——因为他们本就已拥有应用内的全部权限。当然,小团队可以自行权衡、忽略这些建议。
在源码中,这两套角色分别由两个枚举定义,且各含三个等级:
| 枚举 | 取值 | 单字母编码 |
|---|---|---|
GlobalRole | OWNER、ADMINISTRATOR、USER | O、A、U |
AppRole | OWNER、ADMINISTRATOR、USER | O、A、U |
对应文件为 GlobalRole.java 和 AppRole.java。两者都实现了EnumCode接口,code字段用于在接口参数中传递简化的角色编码。
全局角色(Global Roles)
全局角色定义用户对系统本身的权限,主要职责是维护系统。官方推荐将最宽泛的角色(owner 和 administrator)授予技术支持/运维人员——因为这类用户加入应用后也没有额外收益(其权限已覆盖应用内一切操作)。
Global Owner:系统最高权限与唯一限制
在 CompreFace 中,第一个注册用户会自动获得全局 owner 角色,拥有系统内任意操作的权限:管理用户、创建和管理应用。
Owner 唯一的限制是不能删除自己。因此 owner 若要从系统中退出,必须先把自己 owner 角色移交给别人,然后再删除自己。这一点在源码中得到印证:
- AuthorizationManager.java 中的
verifyCanDeleteUser方法对全局 owner 直接抛出InsufficientPrivilegesException("Global owner cannot be removed!"); - UserService.java 中的
decideNewOwner逻辑处理删除 owner 时的"新 owner 归谁"问题:自删(selfRemoval)时 owner 归属保持为系统内现有的 owner,否则根据Replacer(DELETER或其他)决定由删除者还是全局 owner 接管; - 当全局 owner 被(通过移交流程)转交时,AppService.java 的
passAllOwnedAppsToNewOwnerAndLeaveAllApps会把原 owner 名下所有应用移交给新用户,并保留其在各应用中的AppRole.OWNER身份。
Global Administrator:与 Owner 几乎等权
全局 administrator 的权限与全局 owner 相同,唯一差别是不能管理全局 owner 用户。官方建议将此类角色用户数量缩减到维护系统所需的最少人数。
源码中这一"降权"体现在可分配角色的计算上,见 UserService.java 的getGlobalRolesToAssign:
- 当前操作者是
OWNER时,可分配全部角色(GlobalRole.values()); - 当前操作者是
ADMINISTRATOR时,只能分配ADMINISTRATOR和USER——即无法把用户设为 owner,也无法对 owner 进行角色管理。
Global User:默认角色
所有新注册用户自动获得全局 user 角色。这类用户:
- 不能创建应用;
- 只能访问被显式加入的应用;
- 不能管理其他用户。
他们的定位是使用 CompreFace 做人脸识别的开发者(开发团队成员),而非其他用户与权限的管理者。
从源码看,这一"只能看自己加入的应用"的行为由 AppService.java 的getApps方法实现:当用户全局角色为USER时,查询限定为findAllByUserAppRoles_Id_UserId(userId)(仅返回其有应用角色的应用);其他角色(owner/administrator)则返回全部应用findAllByOrderByNameAsc()。
应用角色(Application Roles)
应用角色定义用户在某个具体应用内的权限,这类用户的主要职责是开发集成 CompreFace 的应用。官方推荐:
- 最宽泛的应用角色(owner 和 administrator)应授予项目经理与团队负责人,因为他们对应用负责;
- 所有应用用户都应同时具备全局 user 角色;
- 全局 user 角色用户要加入应用团队,必须由全局 owner、全局 administrator 或应用 owner 将其直接加入应用。
App Owner:应用内的最高权限
创建应用的用户自动获得该应用的 owner 角色,拥有应用内的全部操作权限:管理应用本身及其应用用户、创建并管理 Face Services。
与全局 owner 一样,应用 owner 的唯一限制是不能把自己从该应用中删除——必须先转让 owner 角色,才能自行退出。AuthorizationManager.java 中的verifyUserDeletionFromApp方法精确编码了这一规则:
- 若删除者(deleter)拥有全局 owner/administrator,则禁止移除应用 owner(
isAppOwnerRemoval检查被删用户是否为应用 owner),但可移除其他成员; - 若删除者是应用成员,则:
USER/ADMINISTRATOR应用角色不能移除他人;OWNER应用角色不能移除自己(isSelfRemoval检查)——只有应用 owner 可以移除普通成员,而任何人都不能把应用 owner 从"应用 owner"位置上直接抹掉。
App Administrator:能管 Face Services,不能管应用
应用 administrator(全局 user 角色 + 应用 administrator 角色)可以创建和管理 Face Services,但不能管理应用本身及其应用用户。
对应源码中,verifyWritePrivilegesToApp(user, app, adminDenied)提供了"管理员也拒绝"的模式:当adminDenied为 true 且用户应用角色为AppRole.ADMINISTRATOR时抛出InsufficientPrivilegesException,用于保护应用级管理操作(如应用自身的增删改),而普通的模型、Face Service 级写操作只排除AppRole.USER。
App User:最低权限,但足够集成
应用 user 是权限最低的角色组合(全局 user + 应用 user),在应用内不能做任何管理操作。但由于应用 user 已经能够获取集成所需的全部信息(如应用 API 密钥、Face Service 调用能力等),官方推荐大多数 CompreFace 用户采用这一角色。
授权核心逻辑速览:AuthorizationManager
所有权限判定集中在 AuthorizationManager.java 中,几个关键方法与文档规则的对应关系如下:
| 方法 | 对应文档规则 |
|---|---|
verifyGlobalWritePrivileges(user) | 只有全局OWNER/ADMINISTRATOR可执行系统级写操作,否则抛InsufficientPrivilegesException |
verifyReadPrivilegesToApp(user, app) | 全局USER必须已加入该应用(存在应用角色)才能读取;owner/administrator 直接放行 |
verifyWritePrivilegesToApp(user, app[, adminDenied]) | 全局 owner/administrator 放行;应用内USER一律拒绝写操作;adminDenied场景下应用ADMINISTRATOR也被拒绝(保护应用级管理操作) |
verifyUserDeletionFromApp(deleter, userGuid, app) | 编码"应用 owner 不能被全局管理员直接移除、不能自删、非 owner 成员不能删人"三条限制 |
verifyCanDeleteUser(userDeleteDto) | 编码"全局 owner 不可删除、全局 user 只能删自己"两条限制 |
异常方面,越权统一抛出 InsufficientPrivilegesException.java,由全局异常处理器映射为 HTTP 响应。测试用例 AuthorizationManagerTest.java 对上述各分支(全局 user 读应用、admin 被拒绝的场景、owner 自删/互删等)提供了行为级验证。
实践建议(与源码行为一致的操作路径)
结合文档建议与上述实现,实际运营 CompreFace 时的操作要点:
- 保留全局 owner 的唯一性:首位注册用户即为 owner,且任何流程都无法删除 owner。若要更换 owner,先由 owner 将全局 owner 相关管理权交接(
getGlobalRolesToAssign允许 owner 分配全部角色),再走删除/移交流程; - 最小化 administrator:全局 administrator 与 owner 几乎等权,仅多一条"不能管理 owner"的限制,建议只授予必要运维人员;
- 应用成员权限分级:项目经理/团队负责人 → 应用 owner 或 administrator;普通集成开发者 → 应用 user(默认推荐);
- 运维人员无需加入应用:全局 owner/administrator 对任何应用都拥有全部读写权限(
verifyWritePrivilegesToApp开头即放行),将其加入应用纯属冗余; - 删除成员前先确认角色:应用 owner 不可被直接移出应用,需先转让 owner;全局 user 只能删除自己。
以上规则均有源码依据,可在 AuthorizationManager.java、UserService.java、AppService.java 及对应测试类中逐条核对,作为多团队共用一套 CompreFace 实例时的权限设计参考。
- 人工智能
- 计算机视觉
- 后端
- AI 应用
【免费下载链接】CompreFace
Leading free and open-source face recognition system
相关推荐
ToolJet 用户角色(User Roles)详解:RBAC 权限模型与工作区角色管理实战
ToolJet 用户角色(User Roles)详解:RBAC 权限模型与工作区角色管理实战 导读 本文围绕 ToolJet 开源低代码平台的 用户角色(Use
低代码后端前端AI 应用MCP 服务StarRocks SHOW ROLES 实战详解:查看系统全部角色与权限审计
StarRocks SHOW ROLES 实战详解:查看系统全部角色与权限审计 SHOW ROLES 是 StarRocks 中用于查看当前系统全部角色的 SQ
数据库OLAP数据仓库大数据湖仓一体数据分析OpenProject 角色与权限(Roles and Permissions)系统管理完整指南
OpenProject 角色与权限(Roles and Permissions)系统管理完整指南 本文是 OpenProject 系统管理指南的「用户与权限」系
后端前端项目管理企业应用协同办公
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考