部门管理系统Spring 登录校验模块开发学习

一、需求分析

在开发一个安全性要求较高的系统时,用户身份的验证是基础模块之一。登录校验模块的主要功能包括:

  1. 验证用户身份:用户提供的用户名和密码需要与系统存储的记录进行匹配。

  2. 生成认证令牌:在身份验证成功后,生成唯一的 JWT(JSON Web Token)令牌,供客户端在后续请求中携带,用于身份识别。

  3. 错误处理:如果验证失败,需要清晰地返回错误提示。

二、代码解读

JWT 工具类

java 复制代码
public class JwtUtils {

    private static String signKey = "SVRIRUlNQQ==";
    private static Long expire = 43200000L; //12 hours;

    public static String generateJwt(Map<String,Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

逻辑说明

  • JWT 生成

    • generateJwt 方法接收一个包含用户信息的 Map

    • 使用 JJWT 库的 Jwts.builder() 构造 JWT,采用 HS256 算法签名,并设置过期时间。

    • 生成的 JWT 是一个字符串,供客户端后续请求时使用。

  • JWT 解析

    • parseJWT 方法接收客户端传递的 JWT 字符串。

    • 通过验证签名密钥解析出原始负载数据 Claims

登录信息类(LoginInfo)

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginInfo {
    private Integer id;

    private String username;

    private String name;

    private String token;
}

逻辑说明

  • @Data:由 Lombok 提供,自动生成 getter、setter、toString、equals 和 hashCode 方法。

  • @AllArgsConstructor:生成带所有字段参数的构造方法。

  • @NoArgsConstructor:生成无参数构造方法。

  • 类的字段包括用户 ID、用户名、真实姓名以及 JWT 令牌,用于登录成功后返回给客户端。

控制层(Controller)

java 复制代码
@RestController
@RequestMapping("/login")
@Slf4j
public class LoginController {

    @Autowired
    private EmpService empService;

    @PostMapping
    public Result login(@RequestBody Emp emp){
        log.info("用户登录:{}", emp.getUsername());
        LoginInfo info = empService.testIdandPassword(emp);
        if(info != null) return Result.success(info);
        return Result.error("账号或密码错误!请重新输入!");
    }
}

逻辑说明

  • @RestController:使用 @RestController(本质上是 @Controller@ResponseBody 的结合),可以让方法的返回值直接序列化为 JSON 格式,并通过 HTTP 响应体返回到客户端。这样非常适合 RESTful 风格的 API 开发。

  • @RequestMapping("/login"):将此控制器的所有接口路径映射到 /login

  • @PostMapping:定义了一个 POST 请求的处理方法。

  • @RequestBody:将请求体中的 JSON 数据解析为 Emp 对象。

  • 日志记录:log.info 用于记录用户尝试登录的用户名。

  • 调用 empService.testIdandPassword(emp) 检查用户身份。

  • 如果验证成功,返回带有用户信息和 JWT 的 Result.success;否则返回错误信息。

服务层(Service)

java 复制代码
@Override
public LoginInfo testIdandPassword(Emp emp) {
    Emp e = empMapper.testIdandPassword(emp);

    Map<String, Object> map = new HashMap<>();
    map.put("name", e.getName());
    map.put("userName", e.getUsername());
    map.put("id", e.getId());

    if(e != null) return new LoginInfo(e.getId(), e.getUsername(), e.getName(), JwtUtils.generateJwt(map));
    return null;
}

逻辑说明

  • 调用 empMapper.testIdandPassword(emp) 查询数据库,验证用户名和密码是否匹配。

  • 如果查询结果非空,将用户信息(如 idusernamename)存入一个 Map 中,生成 JWT。

  • 返回一个包含用户信息和生成的 JWT 的 LoginInfo 对象。

  • 如果查询结果为空,则返回 null

数据访问层(Mapper)

java 复制代码
@Select("select * from emp where password = #{password} and username = #{username}")
Emp testIdandPassword(Emp emp);

逻辑说明

  • 使用 MyBatis 的 @Select 注解直接在接口方法上定义 SQL 查询。

  • 参数 emp 中的 usernamepassword 被动态替换到 SQL 查询中。

  • 查询结果映射到 Emp 对象,如果匹配不到记录,返回 null

总结

本登录校验模块基于 Spring 和 MyBatis 实现了一个完整的用户登录流程。通过使用 JWT 令牌技术,不仅提升了系统的安全性,还提供了较高的扩展性。

相关推荐
面汤放盐16 分钟前
后端系统设计文档模板
后端
阿蒙Amon1 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
daidaidaiyu1 小时前
Spring IOC 源码学习 一文学习完整的加载流程
java·spring
Knight_AL1 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
2***d8851 小时前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端
五阿哥永琪1 小时前
Spring中的定时任务怎么用?
java·后端·spring
追逐时光者1 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 65 期(2026年1.1-1.11)
后端·.net
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
gelald1 小时前
AQS 工具之 CountDownLatch 与 CyclicBarry 学习笔记
java·后端·源码阅读
且去填词1 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go