如何动态控制Skyve应用响应式模式下菜单项的显隐与增删
Skyve响应式模式下动态调整用户可见菜单项实现方案
所有动态菜单调整逻辑统一放在项目扩展包下的CustomerServletFilter类中实现即可,这个类是Skyve预留的全局请求拦截扩展点,响应式模式下全局菜单的构建渲染会经过该过滤器,不需要修改框架核心源码。
具体实现步骤如下:
- 先获取上下文对象:在过滤器的
doFilter方法中,通过WebContext.get()拿到当前Web上下文,再通过CORE.getPersistence().getUser()获取当前登录用户实例,同步查询该用户的偏好配置、业务归属等自定义判定条件即可。 - 直接操作菜单集合完成增删:通过
webContext.getMenu()就能拿到当前请求下可修改的可见菜单List<Menu>集合:- 要隐藏不符合条件的菜单项,直接调用集合的
removeIf()方法,传入你组合好的判定逻辑就行,比如结合用户偏好里的「隐藏非高频模块」开关、用户所属部门的业务范围做过滤 - 要新增自定义菜单项,直接实例化
Menu对象,设置好显示名称、跳转路径、图标属性后,调用集合的add()/addAll()方法插入到目标位置即可
- 要隐藏不符合条件的菜单项,直接调用集合的
- 做好权限兜底:菜单层的动态调整只控制前端可见性,不要替代Skyve原生的角色权限校验,敏感操作对应的文档、模块必须保留原生角色权限配置,菜单过滤仅做展示层的个性化适配。
参考实现代码:
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { WebContext webContext = WebContext.get(); if (webContext != null) { User currentUser = CORE.getPersistence().getUser(); // 读取用户偏好中是否隐藏报表模块的配置 boolean hideReportEntry = Boolean.TRUE.equals(currentUser.getPreference("hideReportMenu")); List<Menu> visibleMenus = webContext.getMenu(); // 移除不符合展示条件的菜单项 visibleMenus.removeIf(menu -> hideReportEntry && "reportCenter".equals(menu.getIdentifier())); // 给管理员加快速审计入口,插到菜单最顶部 if (currentUser.hasRole("admin", "Administrator")) { Menu quickAudit = new Menu(); quickAudit.setName("快速审计"); quickAudit.setOutcome("/e/admin/auditLog"); quickAudit.setIcon("fa-solid fa-clipboard-check"); visibleMenus.add(0, quickAudit); } } chain.doFilter(request, response); }
注意不要把菜单动态逻辑写到单个视图的渲染类中,响应式模式下菜单是全局统一加载的,写在视图层无法覆盖所有页面的菜单渲染场景,会出现部分页面菜单配置不生效的问题。
内容的提问来源于stack exchange,提问作者rbb555
相关产品推荐
相关产品推荐

