用途:为 Frappe 应用开发和扩展权限系统提供系统化指导,覆盖权限评估顺序、扩展钩子、User Permission、Share Permission、权限级别及调试排错。
权限评估顺序:Administrator 检查(Administrator 绕过所有权限检查)、基于角色的权限、控制器 has_permission 钩子、User Permission 文档级限制、Permission Query Conditions(列表与报表的 SQL 过滤)、Share Permission 显式共享。
权限类型(ptypes):select、read、write、create、delete、submit、cancel、amend、print、email、report、import、export、share。
主要能力:核心检查函数 frappe.has_permission(doctype, ptype="read", doc=None, user=None, raise_exception=True, parent_doctype=None, debug=False, ignore_share_permissions=False)。七个扩展钩子中,has_permission 实现文档级逻辑(返回 True 授权、False 拒绝、None 交给后续检查);get_permission_query_conditions 返回 SQL WHERE 条件,用于列表视图过滤并校验单文档访问;get_write_permission_query_conditions 在写入后、提交前校验并在失败时回滚;Server Script 可在 /app/server-script 以“Permission Query”类型编写;has_website_permission 控制门户/网站访问;filter_workflow_transitions 与 has_workflow_action_permission 处理工作流审批路由与动作权限。另有 add_user_permission 与 frappe.share.add 的用法示例。
适用场景:多公司/多地区数据隔离、团队与部门层级访问、状态与时间限制、字段级权限(permlevel)、门户客户订单可见性、审批流权限控制。
限制与注意:子表不单独设权限,随父文档校验;虚拟 DocType 不支持权限查询条件,仅用 has_permission 与角色权限;Administrator 始终绕过检查;SQL 条件须用 frappe.db.escape() 转义防注入;权限检查应为只读操作。调试可用 debug=True 或 frappe.conf.developer_mode=1,读取 frappe.local.permission_debug_log。核心实现文件包括 /frappe/permissions.py、/frappe/model/db_query.py、/frappe/model/document.py、/frappe/core/doctype/user_permission/。技能引用文件较多,具体示例需查阅对应 references 文档。