package com.mindskip.xzs.configuration.spring.security; import com.mindskip.xzs.configuration.property.CookieConfig; import com.mindskip.xzs.configuration.property.SystemConfig; import com.mindskip.xzs.domain.enums.RoleEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; 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.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import java.util.Collections; import java.util.List; @Configuration @EnableWebSecurity public class SecurityConfigurer { /** * The type Form login web security configurer adapter. */ @Configuration public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { private final SystemConfig systemConfig; private final LoginAuthenticationEntryPoint restAuthenticationEntryPoint; private final RestAuthenticationProvider restAuthenticationProvider; private final RestDetailsServiceImpl formDetailsService; private final RestAuthenticationSuccessHandler restAuthenticationSuccessHandler; private final RestAuthenticationFailureHandler restAuthenticationFailureHandler; private final RestLogoutSuccessHandler restLogoutSuccessHandler; private final RestAccessDeniedHandler restAccessDeniedHandler; /** * Instantiates a new Form login web security configurer adapter. * * @param systemConfig the system config * @param restAuthenticationEntryPoint the rest authentication entry point * @param restAuthenticationProvider the rest authentication provider * @param formDetailsService the form details service * @param restAuthenticationSuccessHandler the rest authentication success handler * @param restAuthenticationFailureHandler the rest authentication failure handler * @param restLogoutSuccessHandler the rest logout success handler * @param restAccessDeniedHandler the rest access denied handler */ @Autowired public FormLoginWebSecurityConfigurerAdapter(SystemConfig systemConfig, LoginAuthenticationEntryPoint restAuthenticationEntryPoint, RestAuthenticationProvider restAuthenticationProvider, RestDetailsServiceImpl formDetailsService, RestAuthenticationSuccessHandler restAuthenticationSuccessHandler, RestAuthenticationFailureHandler restAuthenticationFailureHandler, RestLogoutSuccessHandler restLogoutSuccessHandler, RestAccessDeniedHandler restAccessDeniedHandler) { this.systemConfig = systemConfig; this.restAuthenticationEntryPoint = restAuthenticationEntryPoint; this.restAuthenticationProvider = restAuthenticationProvider; this.formDetailsService = formDetailsService; this.restAuthenticationSuccessHandler = restAuthenticationSuccessHandler; this.restAuthenticationFailureHandler = restAuthenticationFailureHandler; this.restLogoutSuccessHandler = restLogoutSuccessHandler; this.restAccessDeniedHandler = restAccessDeniedHandler; } /** * @param http http * @throws Exception exception * csrf is the from submit get method */ @Override protected void configure(HttpSecurity http) throws Exception { http.headers().frameOptions().disable(); List securityIgnoreUrls = systemConfig.getSecurityIgnoreUrls(); String[] ignores = new String[securityIgnoreUrls.size()]; http .addFilterAt(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) .exceptionHandling().authenticationEntryPoint(restAuthenticationEntryPoint) .and().authenticationProvider(restAuthenticationProvider) .authorizeRequests() .antMatchers(securityIgnoreUrls.toArray(ignores)).permitAll() .antMatchers("/api/admin/department/list", "/api/admin/video/getList", "/api/admin/user/conversion", "/api/admin/examPaperGrade/updates", "/api/admin/question/download/question/import/temp", "/api/admin/question/question/import" ).permitAll() .antMatchers("/files/**").permitAll() // 静态资源,可匿名访问 .antMatchers("/api/admin/**").hasAnyRole(RoleEnum.ADMIN.getName(), RoleEnum.DEPT_ADMIN.getName()) .antMatchers("/api/student/**").hasAnyRole(RoleEnum.STUDENT.getName(), RoleEnum.DEPT_ADMIN.getName()) .anyRequest().permitAll() .and().exceptionHandling().accessDeniedHandler(restAccessDeniedHandler) .and().formLogin().successHandler(restAuthenticationSuccessHandler).failureHandler(restAuthenticationFailureHandler) .and().logout().logoutUrl("/api/user/logout").logoutSuccessHandler(restLogoutSuccessHandler).invalidateHttpSession(true) .and().rememberMe().key(CookieConfig.getName()).tokenValiditySeconds(CookieConfig.getInterval()).userDetailsService(formDetailsService) .and().csrf().disable() .cors(); } /** * Cors configuration source cors configuration source. * * @return the cors configuration source */ @Bean public CorsConfigurationSource corsConfigurationSource() { final CorsConfiguration configuration = new CorsConfiguration(); configuration.setMaxAge(3600L); configuration.setAllowedOrigins(Collections.singletonList("*")); configuration.setAllowedMethods(Collections.singletonList("*")); configuration.setAllowCredentials(true); configuration.setAllowedHeaders(Collections.singletonList("*")); final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/api/**", configuration); return source; } /** * Authentication filter rest login authentication filter. * * @return the rest login authentication filter * @throws Exception the exception */ @Bean public RestLoginAuthenticationFilter authenticationFilter() throws Exception { RestLoginAuthenticationFilter authenticationFilter = new RestLoginAuthenticationFilter(); authenticationFilter.setAuthenticationSuccessHandler(restAuthenticationSuccessHandler); authenticationFilter.setAuthenticationFailureHandler(restAuthenticationFailureHandler); authenticationFilter.setAuthenticationManager(authenticationManagerBean()); authenticationFilter.setUserDetailsService(formDetailsService); return authenticationFilter; } } }