package tr.edu.comu.tip.tuspersoneltakipv10n3.security; import com.vaadin.flow.server.ServletHelper; import com.vaadin.flow.shared.ApplicationConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; 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.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 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.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import tr.edu.comu.tip.tuspersoneltakipv10n3.domain.User; import tr.edu.comu.tip.tuspersoneltakipv10n3.repository.UserRepository; import tr.edu.comu.tip.tuspersoneltakipv10n3.sclasses.Role; import javax.servlet.http.HttpServletRequest; import java.util.stream.Stream; /** * Configures spring security, doing the following: *
  • Bypass security checks for static resources,
  • *
  • Restrict access to the application, allowing only logged in users,
  • *
  • Set up the login form,
  • *
  • Configures the {@link UserDetailsServiceImpl}.
  • */ @EnableWebSecurity @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private static final String LOGIN_PROCESSING_URL = "/login"; private static final String LOGIN_FAILURE_URL = "/login?error"; private static final String LOGIN_URL = "/login"; private static final String LOGOUT_SUCCESS_URL = "/login"; private final UserDetailsService userDetailsService; private AuthenticationSuccessHandler authenticationSuccessHandler; @Autowired private PasswordEncoder passwordEncoder; @Autowired private LoggingAccessDeniedHandler accessDeniedHandler; @Autowired public SecurityConfiguration(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } /** * The password encoder to use when encrypting passwords. */ @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public User currentUser(UserRepository userRepository) { return userRepository.findByEmailIgnoreCase(SecurityUtils.getUsername()); } /** * Registers our UserDetailsService and the password encoder to be used on login attempts. */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { super.configure(auth); auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } /** * Require login to access internal pages and configure login form. */ /*@Override protected void configure(HttpSecurity http) throws Exception { // Not using Spring CSRF here to be able to use plain HTML for the login page http.csrf().disable(); }*/ protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin().loginPage("/login").permitAll().successHandler(myAuthenticationSuccessHandler()) .and() .logout() .invalidateHttpSession(true) .clearAuthentication(true) .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login?logout") .permitAll() .and() .exceptionHandling() .accessDeniedHandler(accessDeniedHandler); } @Bean public AuthenticationSuccessHandler myAuthenticationSuccessHandler() { return new MySimpleUrlAuthenticationSuccessHandler(); } /** * Allows access to static resources, bypassing Spring security. */ @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers( // Vaadin Flow static resources "/VAADIN/**", // the standard favicon URI "/favicon.ico", // web application manifest "/manifest.json", "/sw.js", "/offline-page.html", // icons and images "/icons/**", "/images/**", // (development mode) static resources "/frontend/**", // (development mode) webjars "/webjars/**", // (development mode) H2 debugging console "/h2-console/**", // (production mode) static resources "/frontend-es5/**", "/frontend-es6/**"); } }