上一篇我们讲了 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 "退款成功";
}
}
八、测试流程
/auth/login获取 token- Header 加
Authorization: token - 访问
/order/list→ 成功 - 访问
/order/refund→ 403
此时权限系统已经"活了"。
九、下一步优化方向
- 权限从数据库读取
- Redis 缓存权限
- 超级管理员角色
- 数据权限
- 强制下线机制
总结
这一套最小系统做了三件事:
-
认证:JWT 确认身份
-
授权:RBAC 权限点控制
-
拦截:Spring Security 执行
权限系统不在于代码多,而在于结构清晰。
当最小闭环跑通,你就拥有了一个真正的安全骨架。