package com.alterdekim.javabot.security; import com.alterdekim.javabot.handler.CustomAccessDeniedHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.savedrequest.HttpSessionRequestCache; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity public class SpringSecurity { @Autowired private UserDetailsService userDetailsService; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { HttpSessionRequestCache requestCache = new HttpSessionRequestCache(); requestCache.setMatchingRequestParameterName(null); http.csrf().disable() .authorizeHttpRequests((authorize) -> authorize .requestMatchers("/panel").hasAnyAuthority("ROLE_ADMIN") .requestMatchers("/api/**").hasAnyAuthority("ROLE_ADMIN") .requestMatchers("/public/**").permitAll() .requestMatchers("/static/**").permitAll() .requestMatchers("/access-denied").permitAll() .requestMatchers("/signup").permitAll() .requestMatchers("/favicon.ico").permitAll() .requestMatchers("/signup/**").permitAll() .requestMatchers("/").permitAll() .requestMatchers("/script-editor").hasAnyAuthority("ROLE_ADMIN") .requestMatchers("/editor-public").permitAll() ).formLogin( form -> form .loginPage("/login") .loginProcessingUrl("/login") .failureForwardUrl("/") .defaultSuccessUrl("/panel") .permitAll() ) .logout( logout -> logout .logoutUrl("/logout") .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .permitAll() ) .requestCache((cache) -> cache .requestCache(requestCache) ) .exceptionHandling((exc) -> exc .accessDeniedHandler(accessDeniedHandler()) .accessDeniedPage("/access-denied")); return http.build(); } @Bean public AccessDeniedHandler accessDeniedHandler() { return new CustomAccessDeniedHandler(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Bean public static PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } }