第十三课实战版:权限系统实战:RBAC + Spring Security 从 0 到可用(含核心代码)

上一篇我们讲了 RBAC 与 Spring Security 的概念,

这一篇真正动手:用最少的代码,搭一个能挡人的权限系统。

目标只有一句话:

登录能识别人,接口能拦权限。

一、准备工作

依赖(Spring Boot 项目):

XML 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-api</artifactId>
  <version>0.11.5</version>
</dependency>

二、RBAC 数据表(最小版)

只要 5 张表:

  • user
  • role
  • permission
  • user_role
  • role_permission

权限表示例数据:

id code
1 order:read
2 order:refund

三、第一步:登录接口(发 Token)

java 复制代码
@RestController
@RequestMapping("/auth")
public class AuthController {

  @PostMapping("/login")
  public String login(@RequestParam String username) {
    return JwtUtil.createToken(username);
  }
}

四、JWT 工具类(核心)

cpp 复制代码
public class JwtUtil {
  private static final String SECRET = "demo-secret";

  public static String createToken(String username) {
    return Jwts.builder()
        .setSubject(username)
        .signWith(SignatureAlgorithm.HS256, SECRET)
        .compact();
  }

  public static String parse(String token) {
    return Jwts.parser()
        .setSigningKey(SECRET)
        .parseClaimsJws(token)
        .getBody()
        .getSubject();
  }
}

五、Token 过滤器(识别是谁)

java 复制代码
public class JwtFilter extends OncePerRequestFilter {

  @Override
  protected void doFilterInternal(HttpServletRequest req,
                                  HttpServletResponse res,
                                  FilterChain chain)
      throws IOException, ServletException {

    String token = req.getHeader("Authorization");
    if (token != null) {
      String username = JwtUtil.parse(token);

      List<GrantedAuthority> auths =
          List.of(new SimpleGrantedAuthority("order:read"));

      UsernamePasswordAuthenticationToken authentication =
          new UsernamePasswordAuthenticationToken(username, null, auths);

      SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    chain.doFilter(req, res);
  }
}

六、Security 配置(把过滤器挂上)

java 复制代码
@Configuration
@EnableMethodSecurity
public class SecurityConfig {

  @Bean
  SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
        .csrf(csrf -> csrf.disable())
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/auth/**").permitAll()
            .anyRequest().authenticated()
        )
        .addFilterBefore(new JwtFilter(),
            UsernamePasswordAuthenticationFilter.class)
        .build();
  }
}

七、接口权限控制(真正挡人)

java 复制代码
@RestController
@RequestMapping("/order")
public class OrderController {

  @GetMapping("/list")
  @PreAuthorize("hasAuthority('order:read')")
  public String list() {
    return "订单列表";
  }

  @PostMapping("/refund")
  @PreAuthorize("hasAuthority('order:refund')")
  public String refund() {
    return "退款成功";
  }
}

八、测试流程

  1. /auth/login 获取 token
  2. Header 加 Authorization: token
  3. 访问 /order/list → 成功
  4. 访问 /order/refund → 403

此时权限系统已经"活了"。

九、下一步优化方向

  • 权限从数据库读取
  • Redis 缓存权限
  • 超级管理员角色
  • 数据权限
  • 强制下线机制

总结

这一套最小系统做了三件事:

  • 认证:JWT 确认身份

  • 授权:RBAC 权限点控制

  • 拦截:Spring Security 执行

权限系统不在于代码多,而在于结构清晰。

当最小闭环跑通,你就拥有了一个真正的安全骨架。

相关推荐
Raas10010 分钟前
AI网关能做语义缓存吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·后端·spring
天空鸟_时光不老17 分钟前
13-亮点提炼:把技术说辞翻译成业务价值
java·spring boot·spring·spring cloud·mybatis
小蒜学长21 分钟前
基于SpringBoot+Vue的租房管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·租房管理
C++ 老炮儿的技术栈23 分钟前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
洋就在江州26 分钟前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner
CEZ33 分钟前
JeeWMS 开源 WMS 全景导览:一套 Java 仓库管理系统从单据流到代码入口的阅读地图
java·开源
Nebula_g33 分钟前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
极派科技37 分钟前
数据库写成功,MQ 消息却丢了?4 个故障窗口拆透 Transactional Outbox
架构
令狐少侠201138 分钟前
centos7 下,使用docker 部署IOT 调试平台,ThingsBoard 并完美启动
java·spring boot·iot
是希燃亚41 分钟前
AI Agent 的未来,可能不是更强,而是更简单
算法·架构