部门管理系统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 令牌技术,不仅提升了系统的安全性,还提供了较高的扩展性。

相关推荐
wand codemonkey37 分钟前
SpringbootWeb【入门】+MySQL【安装】+【DataDrip安装 】+【连接MySQL】
java·mysql·mybatis
Mahir088 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
辰海Coding9 小时前
MiniSpring框架学习笔记-解决循环依赖的简化IoC容器
笔记·学习
晓梦林9 小时前
cp520靶场学习笔记
android·笔记·学习
RyFit10 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码10 小时前
C++ 内存分区 堆区
java·开发语言·c++
心中有国也有家10 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
Upsy-Daisy10 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
绝知此事10 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海10 小时前
C# 隐式转换深度解析
java·开发语言·c#