【问题标题】:Spring security, OAUTH Cors, OPTIONSSpring 安全性、OAUTH Cors、选项
【发布时间】:2017-03-18 17:57:15
【问题描述】:

我有一个 Spring Boot 应用程序,具有 Oauth 身份验证和资源服务器以及一个应用程序。我的前端在一个单独的服务器上,来自一个单独的位置。我的前端应用程序似乎没有对后端进行预检操作,后端总是响应 401。我的配置如下所示:

// ... annotations
public class OAuthConfig extends WebSecurityConfigurerAdapter {

    // ... authencication providers

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
        .csrf().disable()
        .authorizeRequests()
            .antMatchers("/", "/*.html", "layout/**", "/js/**", "/css/**", "/images/**", "/font/**",
                    "/signup", "/register",
                    "/oauth/**")
            .permitAll()
            .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/oauth/**").permitAll()
            ;

        // @formatter:on
    }

    // ... beans
}

请注意,我还必须为静态内容添加例外,因为尽管有任何文档,但它似乎无法以其他方式工作。

// ... annotations
public class MvcConfig extends WebMvcConfigurerAdapter {

// ... resource resolver, view resolver

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

}

我试图更明确地指定,但也没有成功:

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**").allowedMethods("GET","POST","OPTIONS","DELETE","UPDATE");
    registry.addMapping("/register");
    registry.addMapping("/signup");
    registry.addMapping("/oauth/**").allowedMethods("GET","POST","OPTIONS");
}
//... annotations
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    // ... resource id config

    @Override
    public void configure(HttpSecurity http) throws Exception {
        //@formatter:off
        http
        .anonymous().disable()
            .requestMatchers()
            .antMatchers("/api/**")
        .and()
            .authorizeRequests()
            .antMatchers("/api/**").authenticated()
        .and()
            .exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
        //@formatter:on
    }

}

此时我无法确定我是否遗漏了任何重要的配置,以通过身份验证端点(以及 API 端点的其他部分)实现 CORS

【问题讨论】:

标签: java spring spring-mvc oauth cors


【解决方案1】:

如果您收到 HTTP 401 错误,对我来说这并不意味着 CORS 配置是问题所在。 401 应该意味着未经授权,因此问题可能更多出在您的安全配置中。如果是跨源问题,您会收到类似“请求的资源上不存在 'Access-Control-Allow-Origin' 标头”这样的错误。

事实上,我的一个应用程序在请求因跨源问题而失败时获得了 HTTP 200(OK)。

如果您需要帮助,您应该提供有关收到 401 错误代码的请求/响应的详细信息。


我知道这不是一个真正的答案,但我还没有评论的声誉,所以我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您还可以在服务器上配置 CORS。这将适用于您的应用程序的所有 API。或者您在您的请求和响应中设置“Access-Control-Allow-Origin to *”,以便您的 api 可以响应来自任何服务器的任何请求。

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2015-08-12
      • 2016-07-14
      • 2019-07-26
      • 2014-12-09
      • 2015-02-26
      • 2017-03-10
      • 1970-01-01
      • 2020-05-29
      相关资源
      最近更新 更多