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

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

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

相关推荐
Thecozzy1 小时前
线上 Bug 排查与修复实录
架构
鹏大师运维2 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
wang09073 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java3 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
梦梦代码精4 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
不知名的老吴4 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver4 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨89825 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
56AI6 小时前
360 智语 AI 企业智能体平台深度评测:从 L4 蜂群架构到政企落地实战
人工智能·架构