SpringSecurity跨域问题

来源:7-4 基于数据库Rbac数据模型控制权限

TinyLeon

2018-06-26

jojo老师好:

    我现在按照老师的课程,开发了用户等方面的代码。

    联调时要解决跨域问题。

    我是这么解决跨域问题的:

@SpringBootApplication
public class VBCDApplication extends WebMvcConfigurerAdapter {

	public static void main(final String[] args) {
		SpringApplication.run(VBCDApplication.class, args);
	}

	@Override
	public void addCorsMappings(final CorsRegistry registry) {
		registry.addMapping("/**").allowedHeaders(
				MediaType.APPLICATION_JSON_UTF8_VALUE);
	}
}

    以及:

@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {

	@Override
	public void addCorsMappings(final CorsRegistry registry) {
		registry.addMapping("/**").allowedOrigins("*").allowCredentials(true)
				.allowedMethods("GET", "POST", "DELETE", "PUT").maxAge(3600);
	}

	@Bean
	public MultipartConfigElement multipartConfigElement() {
		final MultipartConfigFactory factory = new MultipartConfigFactory();
		factory.setMaxFileSize(100L * 1024L * 1024L);
		return factory.createMultipartConfig();
	}

}

    结果,前端在联调其它接口时,不再报跨域问题。但是再联调登录接口时,还是不行。

http://img.mukewang.com/szimg/5b3227dd000150a711660560.jpg

    如上图所示,用postman测试登录接口没问题


http://img.mukewang.com/szimg/5b3227dd000185bb11130867.jpg

    这张图是前端发给我的截图,前端用vue.js 开发的。他们说那个500的Options的报错,就是跨域问题。

    他们认为登录的跨域问题我漏配了。

    可是我明明配置的全局跨域呀,请老师指点。

写回答

4回答

花开北海

2018-07-05

网上有很多类似问题,基本上无效,以下方案能解决你的问题(我用的是oauth,web环境没测试过):
第一步:在AppResourceServerConfig加入cors

@Override
public void configure(HttpSecurity http) throws Exception {

    appFormAuthenticationConfig.configure(http);

    formAuthenticationConfig.configure(http);

    http.apply(validateCodeSecurityConfig)
            .and()
            .apply(smsCodeAuthenticationSecurityConfig)
            .and()
            .apply(shuyangSocialSecurityConfig)
            .and()
            .apply(openIdAuthenticationSecurityConfig)
            .and()
            .cors()
            .and()
            .csrf().disable();

    authorizeConfigManager.config(http.authorizeRequests());
}

第二步:在 AppResourceServerConfig 配置以下bean

@Bean
public OAuth2WebSecurityExpressionHandler oAuth2WebSecurityExpressionHandler(ApplicationContext applicationContext) {
    OAuth2WebSecurityExpressionHandler expressionHandler = new OAuth2WebSecurityExpressionHandler();
    expressionHandler.setApplicationContext(applicationContext);
    return expressionHandler;
}

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
    resources.expressionHandler(expressionHandler);
}

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.addAllowedOrigin("*");
    configuration.setAllowCredentials(true);
    configuration.addAllowedHeader("*");
    configuration.addAllowedMethod("*");
    configuration.addAllowedMethod("POST");
    configuration.addAllowedMethod("GET");
    configuration.addAllowedMethod("DELETE");
    configuration.addAllowedMethod("PUT");
    configuration.addAllowedMethod("OPTIONS");
    configuration.addAllowedMethod("PATCH");
    configuration.addAllowedHeader("Authorization");
    configuration.addAllowedHeader("loginType");
    configuration.addExposedHeader("x-auth-token");
    configuration.addExposedHeader("x-total-count");
    configuration.setMaxAge(3600L);
    configuration.setExposedHeaders(Arrays.asList("Access-Control-Allow-Headers", "Origin, No-Cache", "X-Requested-With", "If-Modified-Since", "Pragma", "Last-Modified", "Cache-Control", "Expires", "Content-Type", "X-E4M-With", "x-content-type-options", "x-frame-options", "Authorization", "loginType"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/oauth/token", configuration);
    source.registerCorsConfiguration("/**", configuration);
    return source;
}


0
1
TinyLeon
这个方法特别好,我的qq 990308651.请问能加个好友吗
2018-07-08
共1条回复

小哥哥不开心了

2019-05-13

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AjaxCorsFilter extends CorsFilter {
	
    public AjaxCorsFilter() {
        super(configurationSource());
    }

    private static UrlBasedCorsConfigurationSource configurationSource() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        
        List<String> allowedHeaders = Arrays.asList("x-auth-token", "content-type", "X-Requested-With", "XMLHttpRequest");
        List<String> exposedHeaders = Arrays.asList("x-auth-token", "content-type", "X-Requested-With", "XMLHttpRequest");
        List<String> allowedMethods = Arrays.asList("POST", "GET", "DELETE", "PUT", "OPTIONS");
        List<String> allowedOrigins = Arrays.asList("*");
        
        corsConfig.setAllowedHeaders(allowedHeaders);
        corsConfig.setAllowedMethods(allowedMethods);
        corsConfig.setAllowedOrigins(allowedOrigins);
        corsConfig.setExposedHeaders(exposedHeaders);
        corsConfig.setMaxAge(36000L);
        corsConfig.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);
       return source;
    }
}

过了这么久,你应该解决了。这个方法应该可以解决跨域问题,后面遇到跨域问题的同学可以试试

0
0

无痕00

2018-11-03

前端处理下,正式环境在ngnix上配置下,就行了

0
0

Bodekjan

2018-06-29

你在CorsConfig类中加一下Order试试:

@Configuration

@Order(Ordered.HIGHEST_PRECEDENCE)

public class CorsConfig extends WebMvcConfigurerAdapter {


0
1
TinyLeon
感谢你的回复。加了这个配置后,原来不报跨域错误的,也不能用了。仍然很感谢。
2018-07-02
共1条回复

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程