SpringBoot+Mybatis 登录认证功能实现笔记

一、需求分析

核心目标:实现基于用户名密码的登录认证,保护系统后台安全。

功能要点

  • ✅ 用户输入用户名密码后验证
  • ✅ 验证成功:返回用户信息并跳转首页
  • ✅ 验证失败:提示错误信息

二、技术实现方案

1. 数据库设计

使用已有员工表emp作为认证数据源:

1
2
3
4
5
6
CREATE TABLE emp (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL UNIQUE, -- 登录用户名
password VARCHAR(32) DEFAULT '123456' NOT NULL, -- MD5加密存储更安全
...
);

2. 核心代码实现

2.1 实体类封装

1
2
3
4
5
6
7
8
9
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginInfo {
private Integer id; // 员工ID
private String username; // 登录账号
private String name; // 真实姓名
private String token; // 认证令牌(后续扩展)
}

2.2 Controller层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class LoginController {

@Autowired
private EmpService empService;

@PostMapping("/login")
public Result login(@RequestBody Emp emp) {
LoginInfo loginInfo = empService.login(emp);
return loginInfo != null ?
Result.success(loginInfo) :
Result.error("用户名或密码错误");
}
}

2.3 Service层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
public class EmpServiceImpl implements EmpService {

@Override
public LoginInfo login(Emp emp) {
// 查询数据库验证
Emp dbEmp = empMapper.getByUsernameAndPassword(
emp.getUsername(),
emp.getPassword()
);

return dbEmp != null ?
new LoginInfo(dbEmp.getId(), dbEmp.getUsername(),
dbEmp.getName(), null) :
null;
}
}

2.4 Mapper层

1
2
3
4
5
6
7
8
@Mapper
public interface EmpMapper {
@Select("SELECT * FROM emp WHERE username=#{username} AND password=#{password}")
Emp getByUsernameAndPassword(
@Param("username") String username,
@Param("password") String password
);
}

三、关键点说明

  1. 安全增强建议

    • 🔒 密码应MD5加密存储(示例中为明文,实际项目需加密)
    • 🛡️ 增加验证码防止暴力破解
    • ⏱️ 使用JWT替代简单token实现无状态认证
  2. 接口规范

    • 请求方式:POST /login
    • 请求参数:{"username":"admin", "password":"123456"}
    • 成功响应:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      {
      "code": 1,
      "msg": "success",
      "data": {
      "id": 1,
      "username": "admin",
      "name": "管理员",
      "token": "..."
      }
      }

四、测试验证

测试用例

测试场景 预期结果
正确用户名密码 返回200,包含用户信息
错误密码 返回错误提示
不存在的用户名 返回错误提示

API测试示例

1
2
3
4
5
6
7
POST http://localhost:8080/login
Content-Type: application/json

{
"username": "admin",
"password": "123456"
}

五、扩展思考

  1. 会话管理:当前实现是简单认证,后续可引入:
    • Spring Security框架
    • Redis存储会话信息
  2. 密码安全
    1
    2
    // 实际存储应加密
    password = DigestUtils.md5Hex(password + salt);
  3. 日志审计:记录登录操作日志

六、总结

通过本次开发,我们实现了:

  • 基本的用户名密码认证流程
  • RESTful风格的登录接口
  • 前后端分离的数据交互

重点注意:当前实现是基础版本,生产环境需要加强安全措施!
```