我已经创建了两个Web应用程序-客户端和服务应用程序。
当客户端和服务应用程序部署在同一Tomcat示例中时,它们之间的交互会很好。
但当应用程序部署到单独的Tomcat示例(不同的机器),我得到下面的错误时,请求发送服务应用程序。
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 401
我的客户端应用程序使用JQuery、HTML5和Bootstrap。
对服务进行 AJAX 调用,如下所示:
var auth = "Basic " + btoa({usname} + ":" + {password});
var service_url = {serviceAppDomainName}/services;
if($("#registrationForm").valid()){
var formData = JSON.stringify(getFormData(registrationForm));
$.ajax({
url: service_url+action,
dataType: 'json',
async: false,
type: 'POST',
headers:{
"Authorization":auth
},
contentType: 'application/json',
data: formData,
success: function(data){
//success code
},
error: function( jqXhr, textStatus, errorThrown ){
alert( errorThrown );
});
}
我的服务应用程序使用Spring MVC、Spring Data JPA和Spring Security。
我已经包含了CorsConfiguration
类,如下所示:CORSConfig.java
:
@Configuration
@EnableWebMvc
public class CORSConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("*");
}
}
SecurityConfig.java
:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@ComponentScan(basePackages = "com.services", scopedProxy = ScopedProxyMode.INTERFACES)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("authenticationService")
private UserDetailsService userDetailsService;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
auth.authenticationProvider(authenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().fullyAuthenticated();
http.httpBasic();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.csrf().disable();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
}
Spring安全依赖项:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
我正在使用Apache Tomcat服务器进行部署。
8条答案
按热度按时间mtb9vblg1#
CORS的预检请求使用没有凭据的HTTP
OPTIONS
,请参阅跨源资源共享:否则,请发出预检请求。使用OPTIONS方法,并使用以下附加约束条件,使用引用源作为覆盖引用源,从原始源origin获取请求URL,并设置手动重定向标志和阻止Cookie标志:
您必须允许匿名访问HTTP
OPTIONS
。Spring 安全3
您的修改(和简化)代码:
您仍需要CORS配置(可能带有一些附加值):
Spring 安全4
从Spring Security 4.2.0开始你就可以使用内置的支持,参见Spring Security Reference:
19. CORS系统
Spring框架为CORS提供了一流的支持。CORS必须在Spring Security之前处理,因为预检请求将不包含任何cookie(即
JSESSIONID
)。如果请求不包含任何cookie,并且Spring Security是第一个,则该请求将确定用户未通过身份验证(因为请求中没有cookie)并拒绝它。确保首先处理CORS的最简单方法是使用
CorsFilter
。用户可以通过使用以下代码提供CorsConfigurationSource
来将CorsFilter
与Spring Security集成:wfsdck302#
从Spring Security 4.1开始,这是使Spring Security支持CORS的正确方法(在Sping Boot 1.4/1.5中也需要):
以及:
web.ignoring().antMatchers(HttpMethod.OPTIONS);
web.ignoring().antMatchers(HttpMethod.OPTIONS);
个参考:http://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/cors.html
plupiseo3#
在我的例子中,我有一个启用了OAuth安全的资源服务器,上面的任何一个解决方案都不起作用。
基本上在这个例子中
Ordered.HIGHEST_PRECEDENCE
是关键!https://github.com/spring-projects/spring-security-oauth/issues/938
不同的pom依赖项添加了不同种类的过滤器,因此我们可能会有基于顺序的问题。
atmip9wb4#
由于这些例子对我都没有帮助,所以我就用我自己的知识来处理问题。通常最复杂的bug总是发生在我身上。所以这就是我处理这个bug的方法。
在此方法中:
CorsConfiguration默认有允许的方法:POST,HEAD,GET,所以PUT,DELETE都不起作用!我所做的就是创建CorsConfiguration的新示例并设置允许的方法:
所以现在我的方法看起来像:
而且它的工作方式很有魅力。我希望它能帮助到一些人。当然,所有其他的配置都是由spring.io文档进行的
0kjbasz65#
在主应用程序中添加以下配置。它在Spring Boot应用程序2.3.1中工作
参考源:https://spring.io/guides/gs/rest-service-cors/
46qrfjad6#
试试看:
q8l4jmvw7#
如果你使用UsernamePasswordAuthenticationFilter,你可以很容易地添加@CrossOrigin注解来允许所有这些,并且在安全配置中添加http.cors().和().这对我来说很有效。
...
lstz6jyr8#
这适用于:Spring启动器2.2.6.释放
将“*”变更为生产中有意义的项目