Skip to content

rest: filterAppForUser treats app hidden flag as builder-only access gate — built-in account app returns 404 for all normal users #4829

Description

@baozhoutao

现象(17.0.0-rc.1,真机 A/B 实测)

@objectstack/restfilterAppForUser():

if (item.hidden === true && !sysPerms.has('studio.access') && !sysPerms.has('setup.access')) return null;

把应用的 hidden(语义=不进应用切换器的导航呈现开关)当成了「builder-only / 未发布」的访问开关。而平台内置 account(账户)应用按设计就是 hidden: true(@objectstack/platform-objectsACCOUNT_APP,注释:「Surface via the avatar dropdown, not the App Switcher」;console 头像菜单也特判 e.name !== 'account' 单独给它「个人资料」入口)。

结果:

  • 普通用户 GET /api/v1/meta/app 中 account 应用被整个抹掉,点头像 →「个人资料」→ 整屏「App not available — it may still be publishing」;改密码/头像/已关联账户/活动会话/收件箱全部不可达;
  • 持 setup.access 的管理员一切正常(只挂 Unpublished 黄条)→ 极易被当成偶发故障,长期无人发现。

期望

hidden 只影响导航呈现(应用切换器/我的应用),不参与访问判定;或给内置 account 应用豁免。

复现

  1. 空库启动 17.0.0-rc.1,建任意普通用户(无 studio/setup.access);
  2. 普通用户登录 console,点头像 → 个人资料 → App not available;同会话 GET /api/v1/meta/app 无 account。

下游临时对策(修复后可整体删除)

os-project-titanwind-ehr 登记 PLAT-DEF-040,PR steedos-labs/os-project-titanwind-ehr#745:启动插件以系统身份幂等下发 {hidden:false} 的 env 级 overlay(即 UI「Publish」按钮做的事)。副作用是「账户」出现在应用切换器——正因如此更说明 hidden 的两个语义(导航 vs 访问)必须拆开。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions