Я работаю над проектом, в котором использую Spring Boot для серверной части и React с Axios для внешнего интерфейса. Я столкнулся с проблемой, из-за которой после успешного входа в систему файл cookie сеанса (JSESSIONID) не распознается должным образом при последующих запросах, что, как мне кажется, приводит к ошибке 401 Unauthorized. Серверная часть использует аутентификацию на основе сеанса, и после входа в систему в проверенном мной браузере устанавливается JSESSIONID. Однако при успешном входе в систему он переходит на домашнюю страницу, но выдает «Ошибка: пожалуйста, войдите в систему». даже после того, как идентификатор сеанса уже находится в файле cookie.
Home.jsx
const HomePage = () => {
const [posts, setPosts] = useState([]);
const [newPost, setNewPost] = useState("");
useEffect(() => {
const fetchPosts = async () => {
try {
const data = await getAllPosts();
setPosts(data);
} catch (error) {
alert("fetch post Error: Please log in."); // this alrert comes twice after logging
}
};
fetchPosts();
}, []);
const handleAddPost = async () => {
try {
await createPost({ content: newPost });
alert("Post erstellt!");
} catch (error) {
alert("create post Error: Please log in.");
}
};
login.jsx
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const handleLogin = async (e) => {
e.preventDefault();
try {
const response = await axios.post(
"http://localhost:8080/api/auth/login",
{ username, password },
{ withCredentials: true }
);
alert("Login success"); // this comes first but then goes to home.jsx gives error login first
window.location.href = "/home";
} catch (err) {
alert("incorrect auth");
}
};
secuirtyconfig.java
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/auth/**").permitAll()
.requestMatchers("/api/posts/**").authenticated()
.anyRequest().denyAll()
)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.ALWAYS))
.exceptionHandling(exception -> exception
.authenticationEntryPoint((request, response, authException) -> {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
})
);
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(List.of("http://localhost:3000"));
configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(List.of("Authorization", "Cache-Control", "Content-Type", "X-XSRF-TOKEN"));
configuration.setExposedHeaders(List.of("Authorization", "Set-Cookie"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
postController.java
@RestController
@RequestMapping("/api/posts")
@CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true")
public class PostController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private PostRepository postRepository;
@GetMapping
public ResponseEntity getAllPosts() {
logger.info("--- Get all post Controller --- :: ");
try {
List posts = postRepository.findAll();
return ResponseEntity.ok(posts);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
@PostMapping
public ResponseEntity createPost(@RequestBody Post post) {
logger.info("--- create post Controller --- :: ");
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
"No auth"));
if (auth == null || !auth.isAuthenticated() || "anonymousUser".equals(auth.getName())) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Not authenticated");
}
System.out.println("Benutzer authentifiziert: " + auth.getName());
try {
// Post speichern
post.setUsername(auth.getName());
postRepository.save(post);
return ResponseEntity.ok(post);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
}
}
контроллер входа
@RestController
@RequestMapping("/api/auth")
@CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true")
public class LoginController {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@PostMapping("/login")
public ResponseEntity login(@RequestBody User loginUser, HttpServletRequest request) {
User user = userRepository.findByUsername(loginUser.getUsername())
.orElseThrow(() -> new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid username or password"));
if (passwordEncoder.matches(loginUser.getPassword(), user.getPassword())) {
HttpSession session = request.getSession(true);
session.setAttribute("user", user);
Authentication auth = new UsernamePasswordAuthenticationToken(
user.getUsername(),
null,
List.of()
);
SecurityContextHolder.getContext().setAuthentication(auth);
return ResponseEntity.ok("Login successful!");
} else {
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid username or password");
}
}
может ли кто-нибудь сказать мне, в чем здесь проблема? я новичок в этом, поэтому совершенно не понимаю, что здесь не так.
стек ошибок Java
025-01-07T13:51:15.039+06:00 DEBUG 57869 --- [nio-8080-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing ["Login successful!"]
2025-01-07T13:51:15.041+06:00 DEBUG 57869 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed 200 OK
2025-01-07T13:51:15.912+06:00 DEBUG 57869 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : Securing GET /api/posts
2025-01-07T13:51:15.914+06:00 DEBUG 57869 --- [nio-8080-exec-2] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
2025-01-07T13:51:15.925+06:00 DEBUG 57869 --- [nio-8080-exec-2] o.s.security.web.FilterChainProxy : Securing GET /error
2025-01-07T13:51:15.926+06:00 DEBUG 57869 --- [nio-8080-exec-2] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
2025-01-07T13:51:15.930+06:00 DEBUG 57869 --- [nio-8080-exec-3] o.s.security.web.FilterChainProxy : Securing GET /api/posts
2025-01-07T13:51:15.931+06:00 DEBUG 57869 --- [nio-8080-exec-3] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
2025-01-07T13:51:15.933+06:00 DEBUG 57869 --- [nio-8080-exec-3] o.s.security.web.FilterChainProxy : Securing GET /error
2025-01-07T13:51:15.934+06:00 DEBUG 57869 --- [nio-8080-exec-3] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
Подробнее здесь: https://stackoverflow.com/questions/793 ... -spring-bo
Проблема CORS и сеансового файла cookie: запрос GET возвращает 401, несанкционированный при загрузке Spring с React ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение