同事发来一个项目链接,用户打开后只看到“权限不足,请联系管理员”。他不知道自己登录错了账号、缺少查看权限,还是只能看不能编辑;也不知道管理员是谁。权限限制本身可能正确,但这张页面没有帮助用户判断下一步。
权限不足页面要解决的是一次具体任务如何继续。例如供应商进入合同协作项目,需要补充附件,却只有查看权限。设计应让他知道当前能做什么、缺少哪项权限、怎样申请,以及审核后从哪里继续。团队与资源层级的后台配置可参考设计协作工具的四层权限结构,本文聚焦使用者遇到限制时的界面和恢复流程。

先判断是身份问题、权限问题,还是资源状态问题
未登录时,系统首先需要确认身份;已登录但没有查看权限时,才涉及授权;文件已归档、被锁定或删除,则可能与权限无关。不要把所有不能操作的情况统一写成403或“无权限”,否则用户即使找到管理员,也可能处理错问题。
| 实际情况 | 用户需要看到的解释 | 主要动作 |
|---|---|---|
| 尚未登录 | 登录后确认是否有访问权限 | 登录,并在完成后返回原链接 |
| 登录了另一个账号或团队 | 显示当前账号及当前空间,便于核对 | 切换账号或空间 |
| 没有查看权限 | 在允许披露的范围内说明无法访问 | 申请访问,或返回可访问的位置 |
| 可以查看,不能编辑 | 当前为只读,查看内容仍然正常 | 申请所需操作权限 |
| 资源暂时不可修改 | 说明归档、锁定或流程状态 | 按业务规则解锁、等待或查看记录 |
这些情况需要服务端返回足够明确且安全的状态,设计师不应只凭HTTP数字猜测业务含义。资源是否存在、名称能否显示,也要遵守产品的数据可见性规则;对不可见资源,不要在无权页面中额外暴露文件标题、人员名单或业务内容。
只读、禁用和隐藏应分别使用
内容可查看但不能改动时,优先保留正常阅读体验:文字仍清晰,数据仍能被理解,编辑控件则移除或改为明确的只读呈现。不要把整张表单降到很低透明度,让用户连合同金额都难以看清。Carbon只读状态规范强调保留信息可读性,并降低可编辑的视觉暗示。
某个动作只是缺少前置条件时,可以暂时禁用,并在附近说明如何满足条件。例如先选择审批人再发送申请,就不应该被解释成用户没有发送权限。涉及用户根本不能知道的功能或数据时,可以隐藏相应入口,但后台仍需正确实施权限校验。
Carbon禁用状态模式区分了这些做法。真正落地时还要考虑发现性:如果申请权限是正常业务路径,直接把编辑入口彻底隐藏,用户可能无法发现自己可以申请。可以在页面头部显示“仅可查看”及申请入口,不必让每个字段都重复出现一把锁。
在阻塞发生的位置解释,而不是总把用户带去整页报错
只有一个附件不能下载时,可以在附件区域说明限制;用户能查看项目但不能添加成员时,可以在成员管理区域解释权限。整页阻断适合整个资源不可访问的情况。局部问题使用局部反馈,可以保留用户仍有权使用的信息和任务上下文。
权限错误至少回答两件事:当前为什么不能执行,以及有没有可采取的下一步。Carbon空状态规范把权限问题列为需要提供恢复指引的场景。文案可以写“你目前只有查看权限。申请编辑权限后,可修改这份项目资料”,比“操作失败”更容易采取行动。
不要把后台角色名直接当成解释。例如“需要ROLE_PROJECT_WRITE”不适合普通成员;“请升级为超级管理员”也可能授予远超过任务所需的能力。应围绕当前动作描述缺少的权限,并把角色映射留给管理和授权流程。
一份权限申请要说明对象、动作和有效范围
申请窗口可以带入当前项目与所需动作,让用户填写必要的理由。能由系统确定的信息,不必要求用户再输入项目编号、管理员邮箱或当前账号。若支持临时权限,明确申请期限;若只能申请某个角色,解释该角色会允许哪些关键动作。
例如供应商只需要为“年度采购合同”添加附件,应优先申请该项目的添加附件权限,并按需要限定有效期。如果系统只能按角色授权,则选择能够完成任务的最小权限角色,同时让申请人看清该角色还包含哪些操作。OWASP授权建议中的最小权限原则可以作为权限范围的依据,具体的角色和审批人则按业务制度确定。
提交之前显示“申请对象、申请权限、有效期和接收方”摘要;接收方不适合对申请者公开姓名时,可以使用“项目管理员”这样的业务称谓。若没有任何可用审批人,要在提交前给出联系支持或其他可用路径,避免制造永远无人处理的申请。
提交成功后,不要让用户反复申请同一件事
待审核状态要与无权限状态明显区分。显示“申请已提交”,保留提交时间、申请范围和可查询入口,并把主要动作改为查看申请或返回项目。对于同一对象、同一权限的重复点击,应关联已有申请,而不是生成一串重复待办。
如果允许撤回申请,说明撤回之后会发生什么;如果允许补充理由,保持申请记录连续。提醒管理员的功能需要产品确实支持,并规定频率,不能只画一个看似可用的“催办”按钮。审批耗时没有可靠承诺时,不要在界面写“一分钟内通过”。
用户重新打开旧链接时,也应能看到当前申请状态,而不再次回到最初的申请表。权限状态与申请状态是两个维度:用户仍然没有编辑权限,但申请已经提交。把两者分开建模,界面才不会把“已申请”错误显示为“已有权限”。
通过、驳回和过期,都要有返回原任务的路径
审核通过后,通知应能带用户回到原项目或原页面,并重新确认最新权限。若资源在等待期间被移动或归档,给出实际状态,不要进入一个空白页面。申请的是添加附件权限,返回后应尽量定位到相关区域,而不是仅跳到应用首页。
审核未通过时,展示允许公开的原因和后续路径:可以修改申请范围重新提交、联系指定角色,或继续只读查看。不能公开具体审批理由时,也要说明申请结果,避免只有一个红色“失败”字样。重新申请应保留必要上下文,但不应默认自动重复发送。
临时权限到期后,用户可能仍停留在编辑页面。系统需要在实际操作时再次确认权限,并解释状态已变化。OWASP建议逐请求验证授权,因此隐藏按钮或旧页面的可编辑状态都不能替代后台检查。
如果用户已经输入但尚未保存,权限失效后的处理应结合数据规则设计:可以保留当前会话中的输入并引导恢复权限,或提供业务允许的其他处理方式。不要随意自动下载敏感内容,也不要在没有说明的情况下清空全部输入。设计稿要明确哪些数据可保留、保存在哪里,以及恢复后是否需要处理版本冲突。
申请流程中的账号与资源变化也要覆盖
用户在等待审核时退出账号,再用另一个账号打开通知,应显示当前账号并重新判断权限,而不是把原申请人的授权带过去。通知中的深链接应由系统验证可访问目标,避免跳到已经失效或不属于当前用户的资源。
项目被移到其他空间后,原申请的审批人和权限范围也可能变化。产品需要决定撤销旧申请、转交新审批人还是重新发起,并在申请记录中解释。资源已删除时,应结束无意义的待审核状态;临时权限尚未通过就超过申请有效期时,也要明确显示过期,不能审批通过后立即给出一个不可用结果。
这些变化适合纳入设计工具安全评审清单,由产品与研发共同验证。界面设计在这里的责任,是让当前状态与可采取的动作一致,并且保留可追踪的结果。
从一张无权页面扩展为可验收的状态集
| 验收路径 | 应确认的结果 |
|---|---|
| 未登录打开深链接后登录 | 回到原目标,并按登录身份重新判断 |
| 只读用户申请编辑 | 原内容仍可读,申请范围与当前任务一致 |
| 待审核时再次打开链接 | 展示已有申请,不重复创建 |
| 审核通过后点击通知 | 回到原操作位置,权限已重新核验 |
| 申请驳回、过期或资源被移走 | 状态解释准确,后续路径有效 |
| 编辑途中权限撤回 | 不误报保存成功,输入处理符合约定 |
同时检查键盘能否到达申请入口、对话框关闭后焦点是否返回、待审核与已通过是否能被辅助技术理解。只读文字不能因为失去编辑权限就降低到难以阅读的对比度;其他要求可结合无障碍设计检查处理。
可以在Pixso中整理权限状态和评审原型:使用同一项目名称贯穿只读、申请、待审核、通过和驳回画板,再连接返回项目的路径。参考高保真原型的状态覆盖,让评审者从同事分享的链接开始走完整个流程,确认每一次限制都有清晰且真实的下一步。