|
|
@@ -18,8 +18,13 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
|
|
|
import org.springframework.security.config.http.SessionCreationPolicy;
|
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
|
|
+import org.springframework.web.cors.CorsConfiguration;
|
|
|
+import org.springframework.web.cors.CorsConfigurationSource;
|
|
|
+import org.springframework.web.cors.CorsUtils;
|
|
|
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
|
|
|
/**
|
|
|
* 配置Spring Security
|
|
|
@@ -61,12 +66,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
@Autowired
|
|
|
private JwtAuthenticationFilter jwtAuthenticationFilter;
|
|
|
|
|
|
-// @Bean
|
|
|
-// JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
|
|
|
-// JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager());
|
|
|
-// return jwtAuthenticationFilter;
|
|
|
-// }
|
|
|
-
|
|
|
|
|
|
/**
|
|
|
* 描述: 静态资源放行,这里的放行,是不走 Spring Security 过滤器链
|
|
|
@@ -77,27 +76,19 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
if (!userSetting.isInterfaceAuthentication()) {
|
|
|
web.ignoring().antMatchers("**");
|
|
|
}else {
|
|
|
+ ArrayList<String> matchers = new ArrayList<>();
|
|
|
+ matchers.add("/");
|
|
|
+ matchers.add("/#/**");
|
|
|
+ matchers.add("/static/**");
|
|
|
+ matchers.add("/index.html");
|
|
|
+ matchers.add("/doc.html");
|
|
|
+ matchers.add("/webjars/**");
|
|
|
+ matchers.add("/swagger-resources/**");
|
|
|
+ matchers.add("/v3/api-docs/**");
|
|
|
+ matchers.add("/js/**");
|
|
|
+ matchers.addAll(userSetting.getInterfaceAuthenticationExcludes());
|
|
|
// 可以直接访问的静态数据
|
|
|
- web.ignoring()
|
|
|
- .antMatchers("/")
|
|
|
- .antMatchers("/#/**")
|
|
|
- .antMatchers("/static/**")
|
|
|
- .antMatchers("/index.html")
|
|
|
- .antMatchers("/doc.html") // "/webjars/**", "/swagger-resources/**", "/v3/api-docs/**"
|
|
|
- .antMatchers("/webjars/**")
|
|
|
- .antMatchers("/swagger-resources/**")
|
|
|
- .antMatchers("/v3/api-docs/**")
|
|
|
- .antMatchers("/favicon.ico")
|
|
|
- .antMatchers("/js/**");
|
|
|
- List<String> interfaceAuthenticationExcludes = userSetting.getInterfaceAuthenticationExcludes();
|
|
|
- for (String interfaceAuthenticationExclude : interfaceAuthenticationExcludes) {
|
|
|
- if (interfaceAuthenticationExclude.split("/").length < 4 ) {
|
|
|
- logger.warn("{}不满足两级目录,已忽略", interfaceAuthenticationExclude);
|
|
|
- }else {
|
|
|
- web.ignoring().antMatchers(interfaceAuthenticationExclude);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
+ web.ignoring().antMatchers(matchers.toArray(new String[0]));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -121,7 +112,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
@Override
|
|
|
protected void configure(HttpSecurity http) throws Exception {
|
|
|
http.headers().contentTypeOptions().disable()
|
|
|
- .and().cors()
|
|
|
+ .and().cors().configurationSource(configurationSource())
|
|
|
.and().csrf().disable()
|
|
|
.sessionManagement()
|
|
|
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
|
|
|
@@ -129,50 +120,36 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|
|
// 配置拦截规则
|
|
|
.and()
|
|
|
.authorizeRequests()
|
|
|
+ .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
|
|
|
+ .antMatchers(userSetting.getInterfaceAuthenticationExcludes().toArray(new String[0])).permitAll()
|
|
|
.antMatchers("/api/user/login","/index/hook/**").permitAll()
|
|
|
.anyRequest().authenticated()
|
|
|
// 异常处理器
|
|
|
.and()
|
|
|
.exceptionHandling()
|
|
|
.authenticationEntryPoint(anonymousAuthenticationEntryPoint)
|
|
|
-// .accessDeniedHandler(jwtAccessDeniedHandler)
|
|
|
- // 配置自定义的过滤器
|
|
|
-// .and()
|
|
|
-// .addFilter(jwtAuthenticationFilter)
|
|
|
- // 验证码过滤器放在UsernamePassword过滤器之前
|
|
|
-// .addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)
|
|
|
+ .and().logout().logoutUrl("/api/user/logout").permitAll()
|
|
|
+ .logoutSuccessHandler(logoutHandler)
|
|
|
;
|
|
|
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
|
|
|
-// // 设置允许添加静态文件
|
|
|
-// http.headers().contentTypeOptions().disable();
|
|
|
-// http.authorizeRequests()
|
|
|
-// // 放行接口
|
|
|
-// .antMatchers("/api/user/login","/index/hook/**").permitAll()
|
|
|
-// // 除上面外的所有请求全部需要鉴权认证
|
|
|
-// .anyRequest().authenticated()
|
|
|
-// // 禁用session
|
|
|
-// .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
|
|
|
-// // 异常处理(权限拒绝、登录失效等)
|
|
|
-// .and().exceptionHandling()
|
|
|
-// // 匿名用户访问无权限资源时的异常处理
|
|
|
-// .authenticationEntryPoint(anonymousAuthenticationEntryPoint)
|
|
|
-// // 登录 允许所有用户
|
|
|
-// .and().formLogin()
|
|
|
-// // 登录成功处理逻辑 在这里给出JWT
|
|
|
-// .successHandler(loginSuccessHandler)
|
|
|
-// // 登录失败处理逻辑
|
|
|
-// .failureHandler(loginFailureHandler)
|
|
|
-// // 登出
|
|
|
-// .and().logout().logoutUrl("/api/user/logout").permitAll()
|
|
|
-// // 登出成功处理逻辑
|
|
|
-// .logoutSuccessHandler(logoutHandler)
|
|
|
-// // 配置自定义的过滤器
|
|
|
-// .and()
|
|
|
-// .addFilter(jwtAuthenticationFilter())
|
|
|
-// ;
|
|
|
|
|
|
}
|
|
|
|
|
|
+ CorsConfigurationSource configurationSource(){
|
|
|
+ // 配置跨域
|
|
|
+ CorsConfiguration corsConfiguration = new CorsConfiguration();
|
|
|
+ corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
|
|
|
+ corsConfiguration.setAllowedMethods(Arrays.asList("*"));
|
|
|
+ corsConfiguration.setMaxAge(3600L);
|
|
|
+ corsConfiguration.setAllowCredentials(true);
|
|
|
+ corsConfiguration.setAllowedOrigins(userSetting.getAllowedOrigins());
|
|
|
+ corsConfiguration.setExposedHeaders(Arrays.asList(JwtUtils.getHeader()));
|
|
|
+
|
|
|
+ UrlBasedCorsConfigurationSource url = new UrlBasedCorsConfigurationSource();
|
|
|
+ url.registerCorsConfiguration("/**",corsConfiguration);
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 描述: 密码加密算法 BCrypt 推荐使用
|
|
|
**/
|