用途:在 Frappe/ERPNext 中实现权限系统,提供五层权限模型(角色权限、用户权限、权限级别、权限钩子、数据脱敏)的确定性模式,适用于 v14/v15/v16。
主要能力:角色权限控制 DocType 的增删改查;用户权限按 Link 字段值限制可见记录;权限级别(permlevel 0-9)控制字段可见与可编辑;数据脱敏(v16+)对无 mask 权限用户显示掩码值;has_permission 钩子实现自定义拒绝逻辑;permission_query_conditions 钩子动态过滤列表查询;frappe.share 实现单文档共享。
使用方式:代码中检查权限用 frappe.has_permission() 或 doc.has_permission(),拒绝时抛错用 doc.check_permission() 或 throw=True;用户可见数据查询必须用 frappe.get_list(),系统查询用 frappe.get_all();添加用户权限用 add_user_permission(),共享用 frappe.share.add();查询钩子中必须用 frappe.db.escape() 转义并加表名前缀。
适用场景:需要按角色、记录、字段或文档粒度控制访问的 Frappe 应用开发,包括端点权限校验、列表过滤、字段隐藏与脱敏。
限制:has_permission 钩子只能拒绝,默认必须返回 None;权限级别不表示层级,授予 1+ 级前必须先授予 0 级;数据脱敏不适用于 frappe.db.sql() 或原始 SQL 查询报表,需手动脱敏;get_all() 绕过所有权限过滤;权限变更后需 frappe.clear_cache();ignore_permissions 使用必须注释说明原因。版本差异:select 权限 v14+,Desk User 角色 v15+,数据脱敏与 mask 权限 v16+,自定义权限类型 v16 实验性。