使用 Spring Boot + JWT 实现多角色登录认证(附完整流程图)

本文是「EduCore 教务系统实战系列」第 2 篇,介绍我如何使用 Spring Boot + JWT 实现多角色(管理员 / 教师 / 学生)无状态登录认证机制,附带流程图、完整思路与关键代码结构,适合中后台系统开发者参考。


🎯 实现目标

  • ✅ 支持 ADMIN / TEACHER / STUDENT 三种角色登录;
  • ✅ 登录后返回 JWT Token,无需 Session;
  • ✅ 通过前端携带 Token 实现鉴权访问;
  • ✅ Token 中封装用户 ID、角色等核心信息;
  • ✅ 登录认证逻辑通过策略模式解耦;
  • ✅ 权限由 Spring Security 控制,支持细粒度接口权限拦截;

🔐 为什么选择 JWT + Spring Security?

对比项 原始方案(Session) 当前方案(JWT + Security)
状态管理 服务器维护 Session 客户端持有 Token,后端无状态
可扩展性 多端登录困难 可用于移动端、小程序、扫码登录等
灵活性 角色识别困难,易混乱 可在 Token 中封装角色、权限
安全控制 拦截器写死判断 使用 Spring Security 细粒度控制

📌 登录流程图

plaintext 复制代码
[用户登录页面]
        |
        v
   [输入账号/密码 + 角色]
        |
        v
[Controller 登录接口(/login)]
        |
        v
[LoginStrategyFactory 获取对应策略]
        |
        v
[xxxLoginStrategy 登录验证]
        |
        v
[登录成功 → 生成 JWT Token]
        |
        v
[前端保存 Token(localStorage)]
        |
        v
[携带 Authorization: Bearer xxx 请求后端接口]
        |
        v
[JWT 过滤器解析 Token → 构建用户上下文]
        |
        v
[Spring Security 判断权限 → 成功放行]

🧱 技术结构设计

✅ 1. 登录请求格式(包含角色)

json 复制代码
POST /login

{
  "username": "admin001",
  "password": "123456",
  "role": "ADMIN"
}

✅ 2. 后端 Controller 入口

java 复制代码
@PostMapping("/login")
public R login(@RequestBody Account account) {
    LoginStrategy strategy = loginStrategyFactory.getStrategy(account.getRole());
    Account dbAccount = strategy.login(account);
    if (dbAccount == null) return R.error("账号或密码错误");

    String token = jwtUtils.createToken(dbAccount);
    return R.ok().put("token", token).put("user", dbAccount);
}

✅ 3. 策略模式解耦多角色登录

java 复制代码
public interface LoginStrategy {
    Account login(Account account);
}

@Component("ADMIN")
public class AdminLoginStrategy implements LoginStrategy {
    @Autowired private AdminService adminService;
    public Account login(Account account) {
        return adminService.login(account);
    }
}

@Component("TEACHER")
public class TeacherLoginStrategy implements LoginStrategy {
    @Autowired private TeacherService teacherService;
    public Account login(Account account) {
        return teacherService.login(account);
    }
}

// 工厂类
@Component
public class LoginStrategyFactory {
    @Autowired private Map<String, LoginStrategy> strategyMap;
    public LoginStrategy getStrategy(String role) {
        return strategyMap.get(role);
    }
}

💡 这样写的好处是:当角色增加时无需修改核心逻辑,只需新增一个策略实现类即可


✅ 4. JWT Token 工具类(核心方法)

java 复制代码
public String createToken(Account account) {
    return Jwts.builder()
        .setSubject(account.getId().toString())
        .claim("role", account.getRole())
        .signWith(SignatureAlgorithm.HS256, secretKey)
        .setExpiration(expireDate)
        .compact();
}

✅ 5. JWT 过滤器 + Spring Security 认证链路

  • 自定义 JwtAuthenticationFilter 解析请求头中的 Token;
  • 成功解析后,将用户信息封装为 UsernamePasswordAuthenticationToken 放入 SecurityContextHolder
  • 后续的接口请求将被 Spring Security 统一管理是否有权限访问。

🔄 Token 前后端交互说明

步骤 说明
登录成功 后端返回 Token + 用户信息
前端存储 Vue3 使用 localStorage.setItem("token", xxx)
接口调用 Axios 请求头自动携带 Authorization: Bearer xxx
权限判断 后端解析角色权限后放行 or 拒绝

🧠 常见问题解答

❓ 为何要传 role 参数?

因为多个角色可能存在相同账号(如 admin001 可能是老师又是管理员),必须指定登录身份。

❓ Token 中哪些信息需要加密?

用户 ID + 角色是必须的。密码不应放入 Token。可考虑加入签发时间、IP 白名单等增强信息。

❓ Token 过期怎么办?

目前系统使用短时间有效 Token + 刷新机制,可集成 Redis 实现 Token 黑名单。


📦 项目结构片段(后端)

plaintext 复制代码
├── controller
│   └── LoginController.java
├── service
│   ├── AdminService.java
│   ├── TeacherService.java
├── strategy
│   ├── LoginStrategy.java
│   ├── AdminLoginStrategy.java
│   └── TeacherLoginStrategy.java
├── security
│   ├── JwtAuthenticationFilter.java
│   ├── JwtUtils.java

🔚 总结

通过 Spring Boot + JWT + 策略模式,我实现了一个功能完善、结构清晰的多角色登录认证体系:

  • ✅ 无状态、轻量化、安全性强
  • ✅ 支持多角色解耦,灵活扩展
  • ✅ 支持 PC 登录、扫码登录等多终端适配
  • ✅ 权限控制基于 Spring Security 精细化实现

这套机制也为后续的扫码登录、权限控制、动态菜单等功能奠定了基础。


🧭 下一篇预告

📌《如何用 Spring Security 构建无状态权限控制系统(含角色菜单控制)》


🔗 项目地址


🙋‍♂️ 如果你觉得这篇文章有帮助:

  • 点个赞 👍
  • 收藏 ⭐
  • 关注我 👇 持续发布 Spring Boot / Vue3 实战项目内容
相关推荐
rannn_11125 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
灵感菇_27 分钟前
Java HashMap全面解析
java·开发语言
qq_124987075328 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日35 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼19191 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王1 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)1 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮2 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu2 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud