package mk.ukim.finki.busngo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @EnableMethodSecurity public class WebSecurityConfig { private final PasswordEncoder passwordEncoder; private final CustomUsernamePasswordAuthenticationProvider authProvider; public WebSecurityConfig(PasswordEncoder passwordEncoder, CustomUsernamePasswordAuthenticationProvider authProvider) { this.passwordEncoder = passwordEncoder; this.authProvider = authProvider; } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests( (requests) -> requests .requestMatchers("/", "/home", "/assets/**", "/register") .permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest() .authenticated() ) .formLogin((form) -> form .loginPage("/login") .permitAll() .failureUrl("/login?error=BadCredentials") .defaultSuccessUrl("/", true) ) .logout((logout) -> logout .logoutUrl("/logout") .clearAuthentication(true) .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .logoutSuccessUrl("/login") ) .exceptionHandling((ex) -> ex .accessDeniedPage("/access_denied") ); return http.build(); } @Bean public AuthenticationManager authManager(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.authenticationProvider(authProvider); return authenticationManagerBuilder.build(); } }