Spring Boot通过Spring Security+RBAC实现权限控制,核心是将“用户—角色—权限”映射为UserDetails、GrantedAuthority与SecurityContext,并借助数据库持久化及JWT/Session完成认证授权。

Java Spring Boot 通过集成 Spring Security 实现基于 RBAC 的权限控制,核心在于把“用户—角色—权限”三层关系映射到 Spring Security 的认证与授权机制中,并用数据库持久化角色和权限数据,再通过 JWT 或 Session 实现无状态或有状态的访问控制。
明确 RBAC 数据模型与实体设计
RABC 要落地,先得建好三张基础表(或对应实体类):
-
User:存储用户基本信息(id、username、password、enabled 等),需继承或实现
UserDetails -
Role:角色表(id、roleName,如 "ROLE_ADMIN"、"ROLE_USER"),注意 Spring Security 默认要求角色名带
ROLE_前缀 -
Permission(或 Authority):权限标识,如
"user:read"、"order:delete",不建议用中文或 URL 作权限码 - 关联表:
user_role(用户-角色多对多)、role_permission(角色-权限多对多)
自定义 UserDetailsService 加载动态权限
Spring Security 默认只做登录校验,要支持 RBAC,必须替换默认的内存用户加载逻辑:
- 实现
UserDetailsService接口,根据用户名查出用户 + 关联的角色 + 角色对应的权限列表 - 将查到的权限封装为
GrantedAuthority集合(如SimpleGrantedAuthority("user:read")),返回UserDetails实现类 - 密码必须用
PasswordEncoder(如BCryptPasswordEncoder)加密存储与比对,不能明文
配置 Spring Security 授权规则
在 @Configuration 类中继承 WebSecurityConfigurerAdapter(Spring Boot 2.7+ 建议用函数式配置)或使用 SecurityFilterChain Bean:
立即学习“Java免费学习笔记(深入)”;
- 放行登录接口(
/auth/login)、静态资源、Swagger 等无需鉴权路径 - 对业务接口按权限控制,例如:
.requestMatchers("/api/user/**").hasAuthority("user:read").requestMatchers("/api/admin/**").hasRole("ADMIN")(等价于hasAuthority("ROLE_ADMIN")) - 启用方法级权限(如
@PreAuthorize("hasAuthority('order:edit')")),需开启@EnableMethodSecurity
接入 JWT 实现无状态权限校验
若用 JWT 替代 Session,需额外两步:
- 登录成功后,生成 JWT:把用户 ID、角色列表、权限列表写入 Payload,并签名;返回给前端
- 自定义 JWT 过滤器(继承
OncePerRequestFilter),在每次请求中解析 Header 中的 Token,校验签名与有效期,提取权限并塞入SecurityContext - 注意:JWT 中应存权限标识(
["user:read", "order:write"]),而非仅角色名,避免二次查库;权限变更时需主动使 Token 失效(如加黑名单或缩短有效期)
这套结构让权限真正落到接口粒度,而不是靠前端隐藏菜单来“假装安全”。只要模型清晰、权限码统一、校验点覆盖完整,RBAC 就能稳定支撑从管理后台到开放 API 的各类场景。


















