以下是一个基于Java和Spring Boot框架的登录系统的后端代码实现:
- 定义一个登录接口,接收用户输入的账号和密码。
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
// 获取登录信息
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
// TODO: 输入参数校验
// TODO: 账户验证
}
- 后端代码需要验证用户输入的账号和密码是否正确,可以通过查询数据库或其他认证方式。
我们可以使用 Spring Data JPA 实现对MySQL数据库的操作,查询用户信息并验证账号密码是否正确。
@Autowired
private UserRepository userRepository;
private boolean verifyUser(LoginRequest loginRequest) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
User user = userRepository.findByUsername(username); // 从数据库获取用户信息
if (user != null && encodingPassword(password).equals(user.getPassword())) {
return true; // 当用户名密码正确时,返回 true
}
return false;
}
private String encodingPassword(String password) {
//TODO: 密码加密
return password;
}
- 如果账号和密码正确,生成一个加密的 token,将其保存到数据库或其他存储介质中,并返回给前端。
private String generateToken(User user) {
//TODO: 生成token
String token = "";
//TODO: 将 token 保存到数据库(这里简单处理,只保存了一个 token)
return token;
}
- 前端在后续的请求中需要携带这个 token,后端根据 token 来验证用户的身份,可以令牌通过之后,处理请求并返回结果给前端。
@Autowired
private JwtUtil jwtUtil;
@RequestMapping(value = "/secure/api", method = RequestMethod.GET)
public ResponseEntity<?> getSecureData(HttpServletRequest request) {
String jwt = request.getHeader("Authorization").split(" ")[1];
String username = jwtUtil.extractUsername(jwt);
User user = userRepository.findByUsername(username); //获取用户信息
return ResponseEntity.ok(user);
}
- 如果用户登录失败,根据具体情况返回相应的错误信息,例如用户名或密码错误。
下面是完整的代码实现:
@RestController
public class AuthController {
@Autowired
private JwtUtil jwtUtil;
@Autowired
private UserRepository userRepository;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public ResponseEntity<?> hello() {
return ResponseEntity.ok("Hello World!");
}
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
if (verifyUser(loginRequest)) {
User user = userRepository.findByUsername(loginRequest.getUsername()); // 获取用户信息
String token = generateToken(user); // 生成 token
Map<String, String> response = new HashMap<>();
response.put("token", token);
return ResponseEntity.ok(response); // 返回 token
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); // 登录失败,返回 401
}
}
@RequestMapping(value = "/secure/api", method = RequestMethod.GET)
public ResponseEntity<?> getSecureData(HttpServletRequest request) {
String jwt = request.getHeader("Authorization").split(" ")[1]; // 获取请求头中的 token
String username = jwtUtil.extractUsername(jwt);
User user = userRepository.findByUsername(username); // 获取用户信息
return ResponseEntity.ok(user);
}
private boolean verifyUser(LoginRequest loginRequest) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
User user = userRepository.findByUsername(username); // 从数据库获取用户信息
if (user != null && encodingPassword(password).equals(user.getPassword())) {
return true; // 当用户名密码正确时,返回 true
}
return false;
}
private String generateToken(User user) {
String token = jwtUtil.generateToken(user); // 生成 token
return token;
}
private String encodingPassword(String password) {
//TODO: 密码加密
return password;
}
}
其中 JwtUtil 和 UserRepository 代码可以参考下面的代码实现。
JwtUtil.java
@Component
public class JwtUtil {
private String secret = "my_secret_key";
public String extractUsername(String token) {
return extractClaim(token, Claims::getSubject);
}
public Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}
public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
}
private Claims extractAllClaims(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}
private Boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
public String generateToken(User user) {
Map<String, Object> claims = new HashMap<>();
return createToken(claims, user.getUsername());
}
private String createToken(Map<String, Object> claims, String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
.signWith(SignatureAlgorithm.HS256, secret).compact();
}
public Boolean validateToken(String token, User user) {
final String username = extractUsername(token);
return (username.equals(user.getUsername()) && !isTokenExpired(token));
}
}
UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
这就是一个基于Java和Spring Boot框架的登录系统的代码实现。