Hallo, ich bin mit Spring Security nicht wirklich vertraut, daher hoffe ich, dass mir jemand weiterhelfen kann.
Meine Website, example.com, greift auf einige Endpoints auf api.example.com zu. Siehe hier:
Ich verstehe nicht, warum ich bei den Requests zuerst ein 200 Status bekomme und danach aber 404. So sieht z.B. eine Response aus:
Die 404-Meldung erhalte ich nicht nur über Browser, sondern auch via Postman.
So sieht z.B. ein Controller aus:
Und so sieht meine Konfiguration aus:
Wie wir sehen, funktioniert der Endpoint "/auth/is-token-valid" ziemlich gut, da er erlaubt ist. Aber z.B. "/auth-data" sollte nicht erlaubt sein, da der User vorerst eingeloggt sein muss. Die 404-Meldungen erhalte ich, obwohl ich mich via OAuth (Google) einlogge.
Derselbe Code funktioniert auf localhost ziemlich gut. Der Fehler taucht nur auf dem Live-Server auf.
Was mache ich falsch?
Meine Website, example.com, greift auf einige Endpoints auf api.example.com zu. Siehe hier:
Ich verstehe nicht, warum ich bei den Requests zuerst ein 200 Status bekomme und danach aber 404. So sieht z.B. eine Response aus:
JSON:
{
"timestamp": "2024-10-29T12:18:57.892+00:00",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/user-profile/auth-data"
}
Die 404-Meldung erhalte ich nicht nur über Browser, sondern auch via Postman.
So sieht z.B. ein Controller aus:
Java:
@RestController
@RequestMapping("/user-profile")
@AllArgsConstructor
public class UserProfileController {
private UserProfileService userProfileService;
private UploadService uploadService;
private Jwt jwt;
/**
* Retrieves profile data
* @param authorizationHeader Authorization to obtain user's token
* @return profile data, such as name and profile picture
*/
@GetMapping("/auth-data")
public ResponseEntity<Response> getAuthData(@RequestHeader("Authorization") String authorizationHeader) {
String token = authorizationHeader.substring(7);
UserProfileAuthData data = userProfileService.getAuthData(token);
if (data != null) {
Response response = Response.builder()
.code("USER_PROFILE_DATA")
.status(HttpStatus.OK)
.timestamp(LocalDateTime.now())
.messages(List.of(data))
.build();
return ResponseEntity.status(HttpStatus.OK).body(response);
}
Response response = Response.builder()
.code("NO_DATA")
.status(HttpStatus.NOT_FOUND)
.timestamp(LocalDateTime.now())
.messages(List.of("No data could be found."))
.build();
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}
Und so sieht meine Konfiguration aus:
Java:
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@AllArgsConstructor
@SpringBootApplication(scanBasePackages = {"com.dynamicquotation.dq"})
public class SecurityConfiguration implements WebMvcConfigurer {
private final JwtFilter jwtFilter;
private final DataSource dataSource;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors(cors -> cors.configurationSource(request -> {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(List.of("https://example.com", "https://accounts.google.com"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(List.of("*"));
configuration.setExposedHeaders(List.of("Authorization"));
configuration.setAllowCredentials(true);
return configuration;
}))
.csrf(AbstractHttpConfigurer::disable);
http.sessionManagement(sess -> sess.sessionAuthenticationStrategy(sessionAuthenticationStrategy()));
// Authorization
http.authorizeHttpRequests(auth ->
auth
.requestMatchers("/auth/login", "/auth/is-token-valid", "/logout", "/contact", "/quotation/single-quotation/**").permitAll()
.anyRequest().authenticated()
);
http.oauth2Login(Customizer.withDefaults());
http.httpBasic(withDefaults());
// logout
http.logout(l -> l
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.clearAuthentication(true)
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessHandler((request, response, authentication) -> response.setStatus(HttpServletResponse.SC_OK))
.addLogoutHandler((request, response, authentication) -> {
// Additional logout handler
}).permitAll());
http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
Wie wir sehen, funktioniert der Endpoint "/auth/is-token-valid" ziemlich gut, da er erlaubt ist. Aber z.B. "/auth-data" sollte nicht erlaubt sein, da der User vorerst eingeloggt sein muss. Die 404-Meldungen erhalte ich, obwohl ich mich via OAuth (Google) einlogge.
Derselbe Code funktioniert auf localhost ziemlich gut. Der Fehler taucht nur auf dem Live-Server auf.
Was mache ich falsch?