97 lines
4.0 KiB
Java

package com.userauth.restuserauth.controller;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.userauth.restuserauth.dto.AuthRequest;
import com.userauth.restuserauth.dto.AuthResponse;
import com.userauth.restuserauth.model.Role;
import com.userauth.restuserauth.model.User;
import com.userauth.restuserauth.repository.UserRepository;
import com.userauth.restuserauth.security.JwtTokenProvider;
import org.springframework.util.StringUtils;
import com.userauth.restuserauth.security.JwtBlacklistService; // 新增导入
import jakarta.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/api/auth")
public class AuthController {
private static final Logger logger = LoggerFactory.getLogger(AuthController.class);
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtTokenProvider tokenProvider;
@Autowired
private JwtBlacklistService jwtBlacklistService; // 新增注入
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@RequestBody AuthRequest loginRequest) {
try {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
loginRequest.getUsername(),
loginRequest.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = tokenProvider.generateToken(authentication);
return ResponseEntity.ok(new AuthResponse(jwt, "登录成功"));
} catch (Exception e) {
logger.error("用户 '{}' 认证失败:{}", loginRequest.getUsername(), e.getMessage());
return new ResponseEntity<>("用户名或密码错误", HttpStatus.UNAUTHORIZED);
}
}
@PostMapping("/register")
public ResponseEntity<?> registerUser(@RequestBody AuthRequest registerRequest) {
if (userRepository.findByUsername(registerRequest.getUsername()).isPresent()) {
return new ResponseEntity<>("用户名已存在", HttpStatus.BAD_REQUEST);
}
User user = new User();
user.setUsername(registerRequest.getUsername());
user.setPassword(passwordEncoder.encode(registerRequest.getPassword()));
user.setEmail(registerRequest.getEmail());
user.setPhone(registerRequest.getPhone());
user.setRole(Role.USER);
userRepository.save(user);
return new ResponseEntity<>("用户注册成功", HttpStatus.CREATED);
}
// 更新:登出端点
@PostMapping("/logout")
public ResponseEntity<?> logoutUser(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
String jwt = bearerToken.substring(7);
// 将当前 JWT 加入黑名单
jwtBlacklistService.blacklistToken(jwt);
logger.info("令牌已加入黑名单:{}", jwt);
}
SecurityContextHolder.clearContext();
return ResponseEntity.ok(Map.of("message", "登出成功,令牌已失效"));
}
}