企业级权限系统核心是理清“谁、能做什么、在哪做”,通过RBAC模型解耦用户与权限,用Spring Security+JWT分离认证鉴权,统一权限标识、三级权限粒度及关键安全细节保障可维护性与安全性。

直接用 Spring Boot 搭建企业级通用权限系统,核心不是堆功能,而是理清“谁、能做什么、在哪做”这三件事。重点是把用户、角色、权限、资源四者的关系落到代码和数据库里,同时让认证和鉴权不耦合、不硬编码、不只靠前端拦截。
选对模型:RBAC 是起点,不是终点
RBA C(基于角色的访问控制)仍是后台系统最稳妥的选择。它用“角色”作为中间层,把用户和权限解耦——用户只关联角色,角色再绑定权限。这样新增一个运营专员角色,只需配置对应菜单+按钮+接口权限,不用改任何业务代码。
典型表结构要包含:
- 用户表(sys_user):存登录名、密码(BCrypt 加密)、状态等
- 角色表(sys_role):角色名称、描述、是否启用
- 权限/资源表(sys_permission):建议用唯一英文标识(如 user:list、order:export),避免中文或 URL,便于后端注解和前端判断统一
- 角色-权限关联表(sys_role_permission):多对多关系
- 用户-角色关联表(sys_user_role):支持一个用户多个角色
用 Spring Security + JWT 做认证鉴权分离
JWT 不是万能钥匙,它只负责“你是谁”;Spring Security 负责“你能干啥”。两者要配合,不能混用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 登录成功后生成 JWT,payload 中只放 userId 和 username,不要塞角色列表或权限列表(易篡改、体积大)
- 每次请求携带 JWT,Security 过滤器解析 token 后,查库加载该用户的全部角色和权限,构造成 Authentication 对象
- 接口权限用 @PreAuthorize("hasAuthority('user:delete')") 控制,而不是 if (role.equals("admin")) { ... }
- 菜单和按钮权限由前端调用 /api/menu 接口获取,后端根据当前用户动态返回有权限的菜单树(含按钮标识)
权限点设计要收敛、可追溯
权限粒度决定系统后期好不好维护。推荐三级划分:
- 菜单级:控制左侧导航是否显示(如“用户管理”)
- 操作级:控制页面内按钮是否可见/可用(如“新增”、“导出”)
- 数据级:同为“查看用户”,A 角色只能看本部门,B 角色可看全公司(需结合 MyBatis 拦截器或 SQL 动态拼接实现)
所有权限标识统一注册在枚举类或配置中心,禁止散落在 Controller 或前端代码里。比如定义:
public enum PermissionCode {
USER_LIST("user:list"),
USER_ADD("user:add"),
ORDER_EXPORT("order:export");
private final String code;
// 构造 + getter
}
别漏掉关键工程细节
权限系统容易崩在细节上:
- 密码必须用 BCryptPasswordEncoder 加密存储,禁止明文或简单 MD5
- JWT 密钥不能写死在代码里,走 application.yml 配置或环境变量
- 登录失败次数超限要锁定账号(可结合 Redis 计数),防止暴力破解
- 所有权限校验日志要记录:谁、何时、访问了哪个接口、是否通过,方便审计
- 提供权限调试开关(如 dev 环境允许绕过鉴权),但上线必须关闭

















