0

0

在Java里如何实现基础菜单权限系统_Java逻辑设计实战说明

P粉602998670

P粉602998670

发布时间:2026-02-06 11:04:02

|

679人浏览过

|

来源于php中文网

原创

菜单权限系统应以Menu和Permission对象建模,Menu含permissionCode等字段,Permission仅含code和description;菜单展示与接口鉴权分离,服务端按用户permissionCode筛选并构建树形菜单返回,禁止前端过滤或角色名控制。

在java里如何实现基础菜单权限系统_java逻辑设计实战说明

菜单数据如何用Java对象建模

菜单权限系统的核心是把「菜单」和「权限」抽象成可操作的实体。不能直接用字符串拼接或硬编码路径,否则后期无法做动态加载和RBAC校验。

典型做法是定义两个基础类:MenuPermission,其中 Menu 持有 permissionCode 字段(如 "sys:user:list"),而不是直接存 SQL 或接口 URL。这个 code 是后端鉴权时比对的唯一依据。

  • Menu 应包含:id、name、path、component、icon、sort、parentId、permissionCode、visible(是否在菜单栏显示)
  • Permission 可简化为仅含 codedescription,用于权限点注册与校验
  • 父子菜单靠 parentId 关联,前端渲染时递归组装,Java 层用 Map 构建树形结构更轻量,不必强依赖 Tree 实体类

如何在Spring Security中拦截菜单级访问

Spring Security 默认不关心「菜单是否可见」,只管「能否访问接口」。所以菜单展示逻辑和接口鉴权要分开处理:前者由前端根据用户拥有的 permissionCode 列表过滤,后者由 FilterSecurityInterceptor@PreAuthorize 控制。

关键不是给每个菜单 URL 配 antMatchers,而是统一拦截所有 /api/** 请求,再查用户权限集合是否包含当前请求所需的 permissionCode —— 这个 code 通常从 Controller 方法上的自定义注解(如 @RequiresPermission("sys:role:edit"))提取。

立即学习Java免费学习笔记(深入)”;

  • 避免在 WebSecurityConfigurerAdapter(已过时)里写死 URL 权限映射,改用 SecurityExpressionRoot 扩展表达式,例如 hasPermission('sys:menu:delete')
  • Controller 方法上必须标注对应权限码,否则鉴权失去语义;不要依赖 request.getRequestURI() 去解析菜单,容易被绕过
  • 如果用 JWT,把用户全部 permissionCode 放入 token payload,避免每次请求查库;但注意 token 大小和刷新成本

前端菜单列表怎么安全地返回给用户

后端不能把全量菜单吐给前端再靠 JS 过滤,这是典型的安全漏洞。必须在服务端就完成「当前用户可见菜单」的筛选和组装。

WriteGenie
WriteGenie

一款专注于中英文AI降重与AIGC检测的智能工具

下载

流程是:查出该用户所有有效的 permissionCode → 关联出对应的 Menu 记录 → 去重、排序、构建成树 → 过滤掉 visible = false 的项 → 返回 JSON。整个过程不暴露无权限菜单的任何字段(包括 id、path、name)。

  • 不要用 MyBatis 的 拼 permissionCode IN 查询,易触发 SQL 注入或性能问题;改用 SELECT * FROM menu WHERE permission_code IN (:permissionCodes) + @SelectProvider 动态构建
  • 菜单树构建建议用两次查询:第一次查平铺列表,第二次用 Java Stream + Map 分组递归组装,比数据库自连接更可控
  • 若菜单含外链(如 http://xxx.com)或 iframe 页面,需额外校验 domain 白名单,防止 open redirect

为什么不能用角色名直接控制菜单显示

hasRole('ADMIN') 控制菜单,短期快,长期崩。一旦出现「运营专员能看用户列表但不能删」「客服主管能看订单但不能导出」这类细粒度需求,角色模型立刻失灵。

真正可维护的方案是「菜单绑定 permissionCode → 用户拥有若干 permissionCode → 菜单展示/接口访问均基于 code 校验」。角色只是 permissionCode 的聚合容器,中间加一层 RolePermission 关系表,支持运行时调整。

  • 禁止在 Thymeleaf 模板里写 sec:authorize="hasRole('SALES')" 控制菜单 DOM 渲染,这等于把权限逻辑泄露到前端
  • 后台管理界面的「菜单配置页」本身也要受权限控制,即只有拥有 "sys:menu:manage" 的人才能修改菜单可见性或权限绑定
  • permissionCode 命名要有层级感(模块:资源:操作),比如 "report:sales:export",方便后续按前缀批量授权或审计

菜单权限不是配几个 URL 就完事,它牵扯数据建模、前后端协作边界、token 设计、甚至审计日志埋点。最容易被跳过的其实是「permissionCode 的全生命周期管理」—— 新增菜单时忘了加 code,上线后发现权限失效,又不敢动老 code,最后只能打补丁。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

854

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

351

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1427

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

365

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1003

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

430

2024.04.29

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

60

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.7万人学习

Java 教程
Java 教程

共578课时 | 58.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号