| package com.zy.asrs.wcs.common.security; | 
|   | 
| import com.zy.asrs.wcs.common.constant.Constants; | 
| import com.zy.asrs.wcs.utils.HttpUtils; | 
| import org.springframework.context.annotation.Bean; | 
| import org.springframework.context.annotation.Configuration; | 
| import org.springframework.http.HttpMethod; | 
| import org.springframework.security.access.AccessDeniedException; | 
| 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.configuration.EnableWebSecurity; | 
| import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; | 
| import org.springframework.security.config.http.SessionCreationPolicy; | 
| import org.springframework.security.core.AuthenticationException; | 
| import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | 
| import org.springframework.security.web.AuthenticationEntryPoint; | 
| import org.springframework.security.web.access.AccessDeniedHandler; | 
| import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; | 
| import org.springframework.stereotype.Component; | 
|   | 
| import javax.annotation.Resource; | 
| import javax.servlet.http.HttpServletRequest; | 
| import javax.servlet.http.HttpServletResponse; | 
|   | 
| /** | 
|  * Spring Security配置 | 
|  * | 
|  */ | 
| @Configuration | 
| @EnableWebSecurity | 
| @EnableGlobalMethodSecurity(prePostEnabled = true) | 
| public class SecurityConfig extends WebSecurityConfigurerAdapter { | 
|   | 
|     public static final String[] FILTER_PATH = new String[]{ | 
|             "/test/**", | 
|             "/api/login", | 
|             "/druid/**", | 
|             "/swagger-ui.html", | 
|             "/swagger-resources/**", | 
|             "/webjars/**", | 
|             "/v2/api-docs", | 
|             "/v3/api-docs", | 
|             "/swagger-ui/**" | 
|     }; | 
|   | 
|     @Resource | 
|     private JwtAccessDeniedHandler jwtAccessDeniedHandler; | 
|     @Resource | 
|     private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; | 
|     @Resource | 
|     private JwtAuthenticationFilter jwtAuthenticationFilter; | 
|   | 
|     @Override | 
|     protected void configure(HttpSecurity http) throws Exception { | 
|         http.authorizeRequests() | 
|                 .antMatchers(HttpMethod.OPTIONS, "/**") | 
|                 .permitAll() | 
|                 .antMatchers(HttpMethod.GET, "/api/file/**", "/api/captcha", "/") | 
|                 .permitAll() | 
|                 .antMatchers(FILTER_PATH) | 
|                 .permitAll() | 
|                 .anyRequest() | 
|                 .authenticated() | 
|                 .and() | 
|                 .sessionManagement() | 
|                 .sessionCreationPolicy(SessionCreationPolicy.STATELESS) | 
|                 .and() | 
|                 .csrf() | 
|                 .disable() | 
|                 .cors() | 
|                 .and() | 
|                 .logout() | 
|                 .disable() | 
|                 .headers() | 
|                 .frameOptions() | 
|                 .disable() | 
|                 .and() | 
|                 .exceptionHandling() | 
|                 .accessDeniedHandler(jwtAccessDeniedHandler) | 
|                 .authenticationEntryPoint(jwtAuthenticationEntryPoint) | 
|                 .and() | 
|                 .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); | 
|     } | 
|   | 
|     @Bean | 
|     public BCryptPasswordEncoder bCryptPasswordEncoder() { | 
|         return new BCryptPasswordEncoder(); | 
|     } | 
|   | 
|     // 没有访问权限异常处理 | 
|     @Component | 
|     static class JwtAccessDeniedHandler implements AccessDeniedHandler { | 
|   | 
|         @Override | 
|         public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) { | 
|             HttpUtils.responseError(response, Constants.UNAUTHORIZED_CODE, Constants.UNAUTHORIZED_MSG, e.getMessage()); | 
|         } | 
|   | 
|     } | 
|   | 
|     // 没有登录异常处理 | 
|     @Component | 
|     static class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { | 
|   | 
|         @Override | 
|         public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) { | 
|             HttpUtils.responseError(response, Constants.UNAUTHENTICATED_CODE, Constants.UNAUTHENTICATED_MSG, | 
|                     e.getMessage()); | 
|         } | 
|   | 
|     } | 
|   | 
| } |