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