友友们,早上好。今天继续AI工具实战系列。我将分享最近几个月使用ai工具用于工作的那些事。既是一次知识的分享,又是一次自我的一次总结,也希望自己的一些使用经验可以帮助到大家。下面正文开始。
在开发某个航道管理系统的后端服务时,我需要快速实现一个符合RESTful规范的用户登录接口。该接口需满足以下核心需求:
项目技术栈为Spring Boot 3.2 + MySQL 8.0,要求在1.5小时内完成从零到一的完整实现。我选择CodeBuddy作为开发助手,主要基于其在Spring生态开发中的优秀表现,特别是对安全模块的深度支持。
向CodeBuddy输入核心需求:
开发Spring Boot用户登录接口,要求:
1. 接收username和password参数
2. 实现参数非空校验
3. 使用BCrypt验证密码
4. 生成JWT返回前端
5. 符合RESTful规范
AI快速生成了基础代码结构:
LoginController.java
@RestController
@RequestMapping("/api/auth")
public class LoginController {
@Autowired
private UserService userService;
@PostMapping("/login")
public ResponseEntity<?> login(@Valid @RequestBody LoginRequest loginRequest) {
String jwtToken = userService.authenticate(loginRequest);
Map<String, String> response = new HashMap<>();
response.put("token", jwtToken);
return ResponseEntity.ok(response);
}
}
// 参数校验DTO
@Data
class LoginRequest {
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
}
UserService.java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public String authenticate(LoginRequest loginRequest) {
User user = userRepository.findByUsername(loginRequest.getUsername())
.orElseThrow(() -> new RuntimeException("用户不存在"));
if (!passwordEncoder.matches(loginRequest.getPassword(), user.getPassword())) {
throw new RuntimeException("密码错误");
}
return JwtUtils.generateToken(user.getUsername());
}
}
但是我在实际测试中,发现生成的JWT没有设置过期时间,于是我提出了补充需求:
修改JWT生成逻辑:
1. 过期时间设置为2小时
2. 加密密钥从application.yml配置读取
3. 添加Issuer声明
CodeBuddy完善后的JwtUtils工具类:
public class JwtUtils {
private static final String SECRET_KEY;
private static final long EXPIRATION_TIME = 2 * 60 * 60 * 1000; // 2小时
static {
// 从配置文件读取密钥
SECRET_KEY = System.getenv("JWT_SECRET") != null ?
System.getenv("JWT_SECRET") :
"default-secret-should-be-changed";
}
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.setIssuer("auth-service")
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
}
同时在application.yml中添加配置:
jwt:
secret: ${JWT_SECRET:your-strong-secret-here}
expiration: 7200000 # 备用配置项
使用Postman测试时遇到401错误,向CodeBuddy描述问题:
现象:
1. 发送正确用户名密码返回401
2. 日志显示"密码匹配失败"
3. 数据库密码字段长度为60(符合BCrypt格式)
可能原因及解决方案?
AI快速分析可能原因:
检查发现测试环境数据库使用了旧的MD5加密数据,修正后生成正确的BCrypt密码:
// 测试数据生成脚本
public class TestDataGenerator {
public static void main(String[] args) {
String rawPassword = "test123";
String bcryptPassword = new BCryptPasswordEncoder().encode(rawPassword);
System.out.println("BCrypt密码: " + bcryptPassword); // 输出类似 $2a$10$... 的字符串
}
}
整体任务完成度还是可以的。需要修改的地方不多。提出需求过程中我们需要注意。分模块提需求:先完成基础接口,再逐步优化安全配置;精确描述问题:提供错误日志、请求示例等上下文;要求结构化输出:如"请按Controller-Service-Repository分层生成代码"。对关键安全逻辑进行人工审核,如JWT密钥管理、异常处理策略等。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。