Estoy usando Spring Boot y Thymeleaf. Tengo una página de plantilla 404 personalizada definida en src/main/resources/templates/error/404.html
Esto funciona correctamente cuando los usuarios han iniciado sesión.
Sin embargo, cuando cierran la sesión, no obtienen ningún tipo de página 404, solo se les redirige a /login .
Estoy pensando que mi configuración de seguridad debe cambiar, pero no estoy seguro de qué.
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/","/register*","/resetPassword","/forgotPassword","/login","/404").permitAll() .antMatchers("/admin/**").hasAuthority("ADMIN").anyRequest() .authenticated().and().formLogin().loginPage("/login").failureUrl("/login?error") .defaultSuccessUrl("/dashboard").successHandler(successHandler) .usernameParameter("email").passwordParameter("password") .and().logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login?logout").and() .exceptionHandling().accessDeniedPage("/access-denied"); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/error**","/resources/**", "/static/**", "/css/**", "/js/**", "/img/**"); }En primer lugar, lo animo a usar sangría cuando use la configuración de Java para configurar su seguridad para su aplicación Spring. Ayuda con la legibilidad.
Tenga en cuenta todos los métodos de nivel superior en la primera sangría (authRequest,formLogin,logout), todos configuran/actualizan el objeto HTTP en sí. Todos estos elementos son de la clase org.springframework.security.config.annotation.web.builders.HttpSecurity .
Los hijos de estas clases refinan aún más la configuración de seguridad HTTP.
http .authorizeRequests() .antMatchers("/","/register*","/resetPassword","/forgotPassword","/login","/404") .permitAll() .antMatchers("/admin/**").hasAuthority("ADMIN") .anyRequest().authenticated() // <-------- .and() .formLogin() .loginPage("/login") .failureUrl("/login?error") .defaultSuccessUrl("/dashboard") .usernameParameter("email").passwordParameter("password") .and() .logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login?logout") .and() .exceptionHandling() .accessDeniedPage("/access-denied"); Tenga en cuenta .anyRequest().authenticated() indica específicamente que cualquier solicitud debe ser autenticada. Entonces, cuando intente ir a cualquier URL faltante en su dominio, le pedirá que inicie sesión en lugar de ir a la página 404.
Entonces, si elimina esa declaración y luego intenta ir a una página de URL faltante, lo redirigirá a una página 404.
Si elimina .anyRequest().Authenticated(), podrá iniciar sesión sin autenticarse.
Por lo tanto, no intente eliminar. Por ejemplo, si va a la dirección "http://localhost:8080/user", accederá a la página de autorización. Y si intenta ingresar a la página "http://localhost:8080/user/", será llevado a la página de usuario. Tenga en cuenta que los enlaces difieren solo por la barra inclinada al final. Por supuesto, si elimina ".anyRequest().Authenticated()", en este caso necesita agregar más parámetros a antMatchers como "/usuario" y "/usuario/"
Por lo tanto, sea cuidadoso y atento.