当前位置: 首页 > 知识库问答 >
问题:

CORS飞行前通道在Spring安全方面没有成功

颛孙喜
2023-03-14

我正在构建一个Angular 2应用程序与一个Spring Boot后端。我试图解决CORS预飞行几天的问题。根据本主题,它应该像这样与CORS过滤器一起工作:

@Component
public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "authorization, content-type, xsrf-token");
        response.addHeader("Access-Control-Expose-Headers", "xsrf-token");
        if ("OPTIONS".equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else { 
            filterChain.doFilter(request, response);
        }
    }
}


@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends    ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        .addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class)
        .headers()
            .frameOptions().disable()
            .and()
        .authorizeRequests()
            .antMatchers("/", "/home", "/register", "/login").permitAll()
            .antMatchers("/cottages").authenticated();
    }
}

角形前端:

  import {Injectable} from '@angular/core';
  import {Headers, Http} from "@angular/http";
  import {AppSettings} from "../app.settings";
  import { URLSearchParams } from '@angular/http'

  import {User} from "../_models/_index";
  import {Observable} from "rxjs";

  @Injectable()
  export class AuthenticationService {
   private headers = new Headers({'Content-Type': 'application/json'});
  private tokenHeaders = new Headers({
 'Content-Type': 'application/json',
 'client_id': 'xxx',
 'client_secret': 'xxx'});


constructor(private http: Http) {
}


login(user: User) {
let urlSearchParams = new URLSearchParams();
urlSearchParams.append('username', user.username);
urlSearchParams.append('password', user.password);
let body = urlSearchParams.toString();

return this.http.post(AppSettings.getApiUrl() + "oauth/token", body, { withCredentials: true, headers: this.tokenHeaders })
  .map((responseData) => {
    return responseData.json();
  })
  .map((item: any) => {
    return new User(item);
  })
  .catch((error: any) => Observable.of(error.json().error || 'Server error'));

 }
}

我尝试了其他配置,这是我在这个和其他来源的Spring文档中找到的。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends     AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient("my-trusted-client").authorizedGrantTypes("client_credentials", "password")
            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT").scopes("read", "write", "trust")
            .resourceIds("oauth2-resource").accessTokenValiditySeconds(5000).secret("xxx");
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.checkTokenAccess("isAuthenticated()");
     }
}

共有1个答案

邢鸿博
2023-03-14

我终于有了解决问题的办法。双方都有几个错误(Angular/Java Spring Boot、安全性)。我将在这里发布我的工作代码并解释它。我将从后端开始:

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {


@Override
public void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/", "/users").permitAll().anyRequest()
    .authenticated()
    .and()
    .csrf().disable()

}
}

根据Spring.io教程,WebSecurityConfiguration对我的工作来说是更好的选择--它也可以与ResourceServerConfiguration一起工作。如果我是诚实的,我不知道有什么区别(什么时候我必须使用这个和什么时候使用另一个)。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter {

public SimpleCorsFilter() {
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    HttpServletRequest request = (HttpServletRequest) req;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type");

    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
        response.setStatus(HttpServletResponse.SC_OK);
    } else {
        chain.doFilter(req, res);
    }
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}


}

没有这个CorsFilter,我只能从服务器获得选项响应。

@Injectable()
export class AuthenticationService {

private headers = new Headers({'Content-Type': 'application/json'});

private auth64 = btoa("my-trusted-client:secret");
private tokenHeaders = new Headers({
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic '+this.auth64
});


constructor(private http: Http) {
 }


login(user: User) {
let body = new URLSearchParams();
body.append('grant_type', 'password');
body.append('username', user.username);
body.append('password', user.password);

return this.http.post(AppSettings.getApiUrl() + "oauth/token", body, {headers: this.tokenHeaders})
  .map(data => {
    console.log("it works!");
  }, error => {
    console.log(error.json());
  });

 }
    null
 类似资料:
  • 我试图在本地构建一个用PHP REST框架作为我的api的Ember应用程序。Ember应用程序在提供,而api只在提供。这导致了一个CORS问题。我已经尝试了我能想到的一切,但我不断得到一个错误返回,说请求被阻止,飞行前通道没有成功。它在Firefox或Chrome上都不成功。 我已经将以下内容添加到API的文件中: 有什么想法或解决办法吗?任何帮助都很感激。谢了!

  • 我需要添加CORS过滤器到我的Spring Boot web应用程序。 我添加了CORS映射,如下文所述http://docs.spring.io/spring/docs/current/spring-framework-reference/html/CORS.html 这是我的配置:

  • 我正在尝试删除应用程序中不必要的飞行前请求。为此,我简化了请求的一些部分,删除了自定义头等,但遇到了一个问题-GET请求现在可以在没有预飞行的情况下正常工作,但POST请求仍然存在。 我遵循了以下要求: 请求未设置自定义HTTP头 内容类型为“文本/纯文本;字符集=utf-8” 请求方法必须是GET、HEAD或POST之一。如果是POST,内容类型应为application/x-www-form-

  • 问题陈述:我有一些Rest的API,它们使用Spring安全性进行CSRF保护。此外,这些API将通过Angular WEB UI从不同的Origin/domain访问。我不需要Spring Authentication,因为身份验证由Siteminder处理。 方法:我遵循了Dave Syer提供的CSRF保护的链接:登录页面:Angular JS和Spring Security Part II

  • 问题内容: 这是我的配置: 现在,当我尝试访问我的API时,出现以下错误: 我在做什么错,以及如何正确配置CORS标头以避免发生此问题? 问题答案: 我已经通过创建新的CORS过滤器解决了此问题: 并将其添加到安全配置中: 更新-如今,我使用了更现代的方式切换到:

  • 我们正在考虑将flyway集成到我们的系统中,因为它似乎是以有效方式管理数据库迁移的绝佳工具。 然而,我不太确定如何继续: 我们有三个不同的数据库 < li >生产环境(MySQL) < li >测试环境(MySQL) < li >单元测试(H2内存中) 它们都包含不同的数据(不同的用户等)。数据库之间没有公共数据(在飞行路线页面上,这称为参考数据),只有结构应该保持不变。 看着网站,我的理解是这