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

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

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

相关推荐
Jaxson Lin2 小时前
Java编程进阶:智能仿真无人机项目4.0
java·开发语言·无人机
Remember_9932 小时前
MySQL 索引详解:从原理到实战优化
java·数据库·mysql·spring·http·adb·面试
上海合宙LuatOS2 小时前
LuatOS ——Modbus RTU 通信模式
java·linux·服务器·开发语言·网络·嵌入式硬件·物联网
铁蛋AI编程实战2 小时前
最新 豆包4.0 实操手册:混合架构部署 + 实时交互 + 动态学习
学习·架构·交互
天远云服2 小时前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang
野生技术架构师2 小时前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
Vivienne_ChenW2 小时前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案(续)
java·数据库·人工智能·spring boot·架构·领域驱动
勤奋的小王同学~2 小时前
SpringMVC
java·spring·mvc