当前位置: 首页 > ops >正文

SpringBoot 3.0 开发简单接口

文章目录

  • Spring Boot 开发用户认证接口
    • 项目结构
    • 技术栈
    • 核心代码实现
      • 1. 实体类 (pojo)
      • 2. 数据访问层 (mapper)
      • 3. 服务层 (service)
      • 4. 控制器层 (controller)
      • 5. 工具类 (utils)
    • 数据库表设计
    • 接口文档
      • 1. 用户注册
      • 2. 用户登录
      • 3. 获取用户信息
    • 安全注意事项

Spring Boot 开发用户认证接口

下面是一个完整的 Spring Boot 项目,实现了用户注册、登录和获取用户信息的功能。项目使用了 JWT(token令牌) 进行认证,MD5 加密密码,并遵循了分层架构设计。

项目结构

com/
└── YJZE/├── controller/       # 控制器层├── mapper/           # 数据访问层├── pojo/             # 实体类├── service/          # 服务接口└── service/impl/     # 服务实现└── utils/            # 工具类

技术栈

  • Spring Boot 3.1.3:快速开发框架
  • MyBatis:ORM 框架
  • MySQL:数据库
  • JWT:认证机制
  • Lombok:简化代码
  • Validation:参数校验
  • MD5:密码加密

核心代码实现

1. 实体类 (pojo)

// User.java
@Data
public class User {private Integer id;private String username;@JsonIgnore // 序列化时忽略密码字段private String password;private String nickname;private String email;private String userPic;private LocalDateTime createTime;private LocalDateTime updateTime;
}// Result.java - 统一响应格式
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {private Integer code;  // 0-成功 1-失败private String message;private T data;public static <E> Result<E> success(E data) {return new Result<>(0, "操作成功", data);}public static Result success() {return new Result(0, "操作成功", null);}public static Result error(String message) {return new Result(1, message, null);}
}

2. 数据访问层 (mapper)

@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE username = #{username}")User findByUserName(String username);@Insert("INSERT INTO user(username,password,create_time,update_time) " +"VALUES (#{username},#{password},now(),now())")void add(String username, String password);
}

3. 服务层 (service)

// 接口
public interface UserService {User findByUserName(String username);void register(String username, String password);
}// 实现类
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic User findByUserName(String username) {return userMapper.findByUserName(username);}@Overridepublic void register(String username, String password) {// MD5加密密码String encryptedPwd = Md5Util.getMD5String(password);userMapper.add(username, encryptedPwd);}
}

4. 控制器层 (controller)

@RestController
@RequestMapping("/user")
@Validated
public class UserController {@Autowiredprivate UserService userService;// 用户注册@PostMapping("/register")public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password) {if (userService.findByUserName(username) != null) {return Result.error("用户名已存在");}userService.register(username, password);return Result.success();}// 用户登录@PostMapping("/login")public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password) {User user = userService.findByUserName(username);if (user == null) return Result.error("用户名错误");if (!Md5Util.getMD5String(password).equals(user.getPassword())) {return Result.error("密码错误");}// 生成JWT TokenMap<String, Object> claims = new HashMap<>();claims.put("id", user.getId());claims.put("username", user.getUsername());String token = JwtUtil.genToken(claims);return Result.success(token);}// 获取用户信息@GetMapping("/userInfo")public Result<User> userInfo(@RequestHeader("Authorization") String token) {Map<String, Object> claims = JwtUtil.parseToken(token);String username = (String) claims.get("username");return Result.success(userService.findByUserName(username));}
}

5. 工具类 (utils)

// JWT工具类
public class JwtUtil {private static final String KEY = "your-secret-key";private static final long EXPIRATION = 1000 * 60 * 60 * 12; // 12小时public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims).withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION)).sign(Algorithm.HMAC256(KEY));}public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}
}// MD5工具类
public class Md5Util {public static String getMD5String(String str) {try {MessageDigest md5 = MessageDigest.getInstance("MD5");byte[] digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));return new BigInteger(1, digest).toString(16);} catch (NoSuchAlgorithmException e) {throw new RuntimeException("MD5加密失败", e);}}
}

数据库表设计

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`username` varchar(16) NOT NULL COMMENT '用户名',`password` varchar(32) NOT NULL COMMENT '密码(MD5加密)',`nickname` varchar(16) DEFAULT NULL COMMENT '昵称',`email` varchar(32) DEFAULT NULL COMMENT '邮箱',`user_pic` varchar(128) DEFAULT NULL COMMENT '头像URL',`create_time` datetime NOT NULL COMMENT '创建时间',`update_time` datetime NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

接口文档

1. 用户注册

  • URL: /user/register
  • Method: POST
  • Request Params:
    • username: 5-16位非空字符
    • password: 5-16位非空字符
  • Success Response:
    {"code": 0,"message": "操作成功","data": null
    }
    

2. 用户登录

  • URL: /user/login
  • Method: POST
  • Request Params:
    • username: 5-16位非空字符
    • password: 5-16位非空字符
  • Success Response:
    {"code": 0,"message": "操作成功","data": "JWT_TOKEN"
    }
    

3. 获取用户信息

  • URL: /user/userInfo
  • Method: GET
  • Headers:
    • Authorization: JWT_TOKEN
  • Success Response:
    {"code": 0,"message": "操作成功","data": {"id": 1,"username": "testuser","nickname": null,"email": null,"userPic": null,"createTime": "2023-01-01T00:00:00","updateTime": "2023-01-01T00:00:00"}
    }
    

安全注意事项

  1. 密码加密:使用MD5对密码进行加密存储
  2. 敏感信息过滤:使用@JsonIgnore过滤密码字段
  3. JWT安全
    • 使用足够复杂的密钥
    • 设置合理的过期时间
    • 使用HTTPS传输
  4. 参数校验:使用@Validated和正则表达式校验输入参数

这个实现提供了一个基础的认证系统,可以根据实际需求扩展更多功能,如密码重置、权限管理等。

http://www.xdnf.cn/news/5965.html

相关文章:

  • 芯片测试之Input Leakage Current(输入漏电流)Test全解析:从原理到实战
  • 火山引擎实时音视频 高代码跑通日志
  • AMS3xxi激光测距仪安装调试维护详解
  • LeetCode 热题 100 105. 从前序与中序遍历序列构造二叉树
  • OpenHarmony轻量系统--BearPi-Nano开发板网络程序测试
  • 图像识别与 OCR 应用实践
  • Spring Security与SaToken的对比
  • 分步启动容器操作指南
  • 一文辨析Java基本数据类型与包装类
  • 日志链路ID配置,traceId多线程不打印什么鬼?
  • 解锁 CPFR 潜力:电商智能补货优化算法的全链路设计与实战指南
  • 特征偏移、标签偏移、数量偏移、概念漂移分别是什么?
  • 不锈钢气动保温V型球阀:专为高粘度、颗粒介质设计的智能控温解决方案-耀圣
  • 【bag of n-grams】 N-gram词袋模型 简介
  • 物联网设备如何与互联网“牵手”
  • CSP认证准备第三天-差分及第36次CCF认证(BFS)
  • 第十七章:Llama Factory 深度剖析:易用性背后的微调框架设计
  • JavaScript实践(三)JavaScript序列化与反序列化深度解析
  • 线性投影层---将输入特征从一个空间映射到另一个空间
  • 【一次成功!】Ubuntu22.04安装cartographer
  • hashicorp vault机密管理系统的国产化替代:安当SMS凭据管理系统,量子安全赋能企业密钥管理
  • 数据擦除标准:1-Pass vs. 3-Pass vs. 7-Pass有什么区别,哪个更好?
  • mysql版本升级常见错误
  • 找客户软件如何实现精准定位?
  • 竞业禁止协议中AI技能限制的深度剖析
  • 【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
  • 如何检测和解决服务器端口被占用的问题
  • #降级监听#PASS THE HASH常见的利用方式#Relay HASH
  • 嵌入式操作系统学习笔记
  • JAVA:synchronized总结