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", "登出成功,令牌已失效")); } }