package ee.esutoniagodesu.config; import ee.esutoniagodesu.repository.domain.ac.UserRepository; import ee.esutoniagodesu.security.*; import ee.esutoniagodesu.web.filter.CsrfCookieGeneratorFilter; 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.method.configuration.EnableGlobalMethodSecurity; 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.data.repository.query.SecurityEvaluationContextExtension; import org.springframework.security.web.csrf.CsrfFilter; import org.springframework.social.security.SpringSocialConfigurer; import javax.inject.Inject; @Configuration @EnableWebSecurity(debug = false) @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Inject private AjaxAuthenticationSuccessHandler ajaxAuthenticationSuccessHandler; @Inject private AjaxAuthenticationFailureHandler ajaxAuthenticationFailureHandler; @Inject private AjaxLogoutSuccessHandler ajaxLogoutSuccessHandler; @Inject private Http401UnauthorizedEntryPoint authenticationEntryPoint; @Inject private UserRepository userRepository; @Bean public UserDetailsService userDetailsService() { return new RepositoryUserDetailsService(userRepository); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Inject public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()) .passwordEncoder(passwordEncoder()); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring() .antMatchers("/scripts/**/*.{js,html}") .antMatchers("/bower_components/**") .antMatchers("/i18n/**") .antMatchers("/assets/**"); } @Override protected void configure(HttpSecurity http) throws Exception { http.requiresChannel() .and() .csrf() .ignoringAntMatchers("/websocket/**") .and() .addFilterAfter(new CsrfCookieGeneratorFilter(), CsrfFilter.class) .exceptionHandling() .authenticationEntryPoint(authenticationEntryPoint) .and() .formLogin() .loginProcessingUrl("/api/authentication") .successHandler(ajaxAuthenticationSuccessHandler) .failureHandler(ajaxAuthenticationFailureHandler) .usernameParameter("j_username") .passwordParameter("j_password") .permitAll() .and() .logout() .logoutUrl("/api/logout") .logoutSuccessHandler(ajaxLogoutSuccessHandler) .deleteCookies("JSESSIONID") .permitAll() .and() .headers() .frameOptions() .disable() .and() .authorizeRequests() .antMatchers(permitAll).permitAll() .antMatchers("/api/**").authenticated() .antMatchers(permitAdmin).hasAuthority(AuthoritiesConstants.ADMIN) .and().apply(springSocialConfigurer); } @Inject private SpringSocialConfigurer springSocialConfigurer; public static final String[] permitAll = { "/api/readings", "/api/readings/*", "/api/readingPages/byReading", "/api/git", "/api/dict/**", "/api/media/*", "/api/rtk/**", "/auth/**", "/disconnect/facebook", "/api/morphology/**", "/api/translator", "/api/register", "/api/register/external", "/api/activate", "/api/authenticate", "/api/account/reset_password/init", "/api/account/reset_password/finish" }; public static final String[] permitAdmin = { "/api/audits/**", "/api/users/**", "/health/**" }; @Bean public SecurityEvaluationContextExtension securityEvaluationContextExtension() { return new SecurityEvaluationContextExtension(); } }