第十三课实战版:权限系统实战: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 执行

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

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

相关推荐
小旭952717 小时前
Spring MVC :从入门到精通(上)
java·后端·spring·mvc·intellij-idea
阿杜杜不是阿木木17 小时前
从0到1构建像Claude Code那样的Agent(三):行动前先计划
java·服务器·windows·agent·ai编程·claudecode
StackNoOverflow17 小时前
Spring MVC核心知识点快速梳理
java·spring·mvc
步步为营DotNet17 小时前
使用.NET 11的Native AOT提升应用性能
java·前端·.net
jing-ya17 小时前
day 54 图论part6
java·开发语言·数据结构·算法·图论
九河云17 小时前
云供应链安全:第三方 SaaS 服务的风险评估与管控
大数据·运维·安全·架构·数字化转型
深念Y17 小时前
Java并发集合:原理与使用场景速查
java·开发语言
恼书:-(空寄17 小时前
Spring Boot 实现事件监听(监听器+自定义事件)完整指南
java·spring boot·后端
我真会写代码18 小时前
深入解析Java ArrayList与HashMap扩容机制:原理、差异与实战避坑
java·数据结构·算法·集合
代码探秘者18 小时前
【大模型应用】3.分块入门
java·后端·python·spring