大数跨境
0
0

SpringBoot3+SpringSecurity6+JWT打造企业级权限系统

SpringBoot3+SpringSecurity6+JWT打造企业级权限系统 终码一生
2025-10-12
0
点击“终码一生”,关注,置顶公众号
每日技术干货,第一时间送达!
图片

在现代前后端分离项目中,用户认证与权限控制是绕不开的话题。传统的基于 Session 的方案在微服务或跨域环境下显得笨重、不灵活。
图片

为了解决这些问题,我们采用 Spring Boot 3.x 搭配 Spring Security 6.x,通过 JWT 实现无状态的认证体系,并集成方法级权限注解、Token 自动续期与黑名单控制机制,构建一个安全、高效、可扩展的权限系统。
图片
01
技术选型与项目结构
图片
技术栈
• Spring Boot 3.x
• Spring Security 6.x
• JSON Web Token (jjwt)
• MyBatis + MySQL
• Redis(可选,用于 Token 黑名单)
模块结构图
com.example.demo
├── config
│   └── SecurityConfig.java
├── controller
│   ├── AuthController.java
│   ├── DemoController.java
│   └── HelloController.java
├── entity
│   └── User.java
├── filter
│   └── JwtAuthenticationFilter.java
├── handler
│   ├── CustomAccessDeniedHandler.java
│   └── CustomLoginFailureHandler.java
├── mapper
│   └── UserMapper.java
├── point
│   └── CustomAuthenticationEntryPoint.java
├── service
│   └── MyUserDetailsService.java
├── utils
│   ├── JwtUtils.java
│   └── TokenBlacklist.java
└── SecurityDemoApplication.java
图片
02
功能实现详解
图片
3.1 用户登录与 Token 生成
用户通过 /auth/login 接口提交用户名密码,系统验证通过后,签发一个包含用户名和角色信息的 JWT:

String token = Jwts.builder()
    .setSubject(username)
    .claim("role", role)
    .setIssuedAt(now)
    .setExpiration(expiry)
    .signWith(key, SignatureAlgorithm.HS256)
    .compact();

前端需将该 Token 保存在本地(如 localStorage)并在后续请求中通过 Authorization: Bearer xxxxxx 的方式传递。
3.2 JWT 鉴权流程
JWT 鉴权通过 JwtAuthenticationFilter 实现,它继承 OncePerRequestFilter,会在每次请求时验证 Token 的合法性,并将用户信息注入 Spring Security 上下文中:

String header = request.getHeader("Authorization");
if (header != null && header.startsWith("Bearer ")) {
    Claims claims = jwtUtils.parseToken(token);
    // 验证通过后构建Authentication对象
    UsernamePasswordAuthenticationToken authToken = ...
    SecurityContextHolder.getContext().setAuthentication(authToken);
}
流程图(可视化):
前端 -> 登录接口 -> JWT签发 -> 保存Token
     -> 带Token访问受保护接口 -> 过滤器校验 -> 放行或拒绝
3.3 方法级权限控制
Spring Security 支持使用 @PreAuthorize 注解实现方法级权限控制:

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String adminApi() {
    return "管理员接口";
}

确保在 SecurityConfig 中启用:

@EnableMethodSecurity
3.4 Token 自动续期
X-Refresh-Token每次成功访问受保护接口时,过滤器判断 Token 剩余时间是否低于阈值(如10分钟),如果是则自动签发新 Token 并通过响应头 X-Refresh-Token 返回:

if (jwtUtils.shouldRefresh(claims.getExpiration())) {
    String newToken = jwtUtils.generateToken(username, role);
    response.setHeader("X-Refresh-Token", newToken);
}

前端监听 X-Refresh-Token 并自动更新本地 Token。
3.5 Token 黑名单机制
用户退出登录时,将当前 Token 加入黑名单(可用 Redis 设置自动过期):
redisTemplate.opsForValue().set("blacklist:" + token, "1", ttl, TimeUnit.MILLISECONDS);
在过滤器中拒绝黑名单内的 Token:
if (redisTemplate.hasKey("blacklist:" + token)) {
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    return;
}
黑名单使用 Redis TTL 自动过期,无需手动清理。
3.6 登录失败与未授权处理
自定义以下处理器统一返回 JSON 格式错误信息:
示例返回 JSON:
{
  "code"401,
  "message""未登录或Token无效"
}
图片
03
常见问题与解决方案
图片
1、AuthenticationManager Bean 不存在?
手动构造并通过 @Bean 注入
2、JWT 密钥长度报错?
使用 Keys.secretKeyFor(SignatureAlgorithm.HS256) 或 ≥32位字符串
3、本地和远程仓库历史不同?
git pull origin main --allow-unrelated-histories
图片
04
源码地址
图片
  • https://gitee.com/nidayeyo/spring-security-demo
来源:juejin.cn/post/7527184146567053375
END
PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。



往期推荐



SpringBoot 3.x 集成 Flowable 7.x:流程设计、部署、启动及完成实战

搞定 Nginx 生产部署:避坑指南 + 最佳实践

从零手撸 SpringBoot 日志分析系统:打造高性能慢SQL检测神器

Spring 官宣正式弃用 RestTemplate

支付宝:多线程事务怎么回滚?说用@Transactional可以回去等通知了!

Spring Boot 实现微信登录,So Easy !


【声明】内容源于网络
0
0
终码一生
开发者聚集地。分享Java相关开发技术(JVM,多线程,高并发,性能调优等),开源项目,常见开发问题和前沿科技资讯!
内容 1876
粉丝 0
终码一生 开发者聚集地。分享Java相关开发技术(JVM,多线程,高并发,性能调优等),开源项目,常见开发问题和前沿科技资讯!
总阅读412
粉丝0
内容1.9k