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

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

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

相关推荐
云烟成雨TD16 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
行乾16 小时前
鸿蒙端 IMSDK 架构探索
架构·harmonyos
于慨16 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz16 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
swg32132117 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald17 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川17 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月17 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming66617 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
若风的雨17 小时前
【deepseek】RISC-V 的CSR寄存器详解
架构